为什么我的TKINTER程序不起作用?我可以找到错误

发布于 2025-02-07 05:07:11 字数 1490 浏览 1 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

谷夏 2025-02-14 05:07:11

这里有一些要打开包装。

首先,PACK方法返回,因此当您执行时:

label = Label(root, image=image1).pack(side= LEFT)

Label基本上没有一个,因此更改其映像将无法正常工作。

其次,而不是为paris编写功能,为什么不编写将城市作为参数的通用函数?然后,您可以使用lambda函数将此函数分配为按钮的命令。

最后,正如此答案 Image1 将在功能结束时收集,因此,您应该指定使用global内在功能内已声明的变量。 (更好的解决方案是将您的窗口创建为类,并设置self.image1

q1 = """Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris"""
q2 = """Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1
Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1
Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 """
w1 = """ london london london london london london
london london london london london london london
london"""
w2 = """Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris"""
e1 = """Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris"""
e2 = """Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris"""

class City():
    """docstring for City"""
    def __init__(self, text, text_night, image, image_night):
        self.text = text
        self.text_night = text_night
        self.image = image
        self.image_night = image_night


def set_city_pic(city: City):
    global image1
    if night_mode.get():
        im = PhotoImage(file=city.image_night)
        text.configure(text=str(city.text_night))
    else:
        im = PhotoImage(file=city.image)
        text.configure(text=str(city.text))

    image1 = im.subsample(2, 2)
    label.configure(image=image1)

Paris = City(q1, q2, "paris_day.png", "paris_night.png")
London = City(w1, w2, "london_day.png", "london_night.png")
Berlin = City(e1, e2, "berlin_day.png", "berlin_night.png")

from tkinter import *

root = Tk()
root.title("Trips")
root.geometry("750x400")
frame = Frame(root, width = 1, height=4)


knopka1=Button(master=frame, text="Paris", command=lambda: set_city_pic(Paris))
knopka1.pack(padx=5, pady=5)
knopka2=Button(master=frame, text="London", command=lambda: set_city_pic(London))
knopka2.pack(padx=5, pady=5)
knopka3=Button(master=frame, text="Berlin", command=lambda: set_city_pic(Berlin))
knopka3.pack(padx=5, pady=5)

night_mode = IntVar()
praporets = Checkbutton(master=frame, text = "Night mode", variable = night_mode, onvalue = 1, offvalue = 0, height=5, width = 20)
praporets.pack(padx=5, pady=5)
frame.pack(side=LEFT)

im = PhotoImage(file=Paris.image)
image1 = im.subsample(2, 2)
label = Label(root,  image=image1)
label.pack(side= LEFT)
text = Label(root)
text.pack(side=LEFT)

root.mainloop()

There is a bit to unpack here.

First, the pack method returns None, so when you do:

label = Label(root, image=image1).pack(side= LEFT)

label is basically None so changing its image won't work.

Secondly, instead of writing a function for Paris why don't you write a generic function that will take a City as argument? You can then assign this function as command for your buttons using a lambda function.

Finally, as mentionned in this answer image1 would be garbaged collected at the end of your function, so you should specify that you're using the already declared variable inside your function with global. (the better solution would be to create your window as a class, and set self.image1)

q1 = """Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris"""
q2 = """Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1
Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1
Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 """
w1 = """ london london london london london london
london london london london london london london
london"""
w2 = """Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris"""
e1 = """Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris"""
e2 = """Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris
Paris Paris Paris Paris Paris Paris Paris Paris"""

class City():
    """docstring for City"""
    def __init__(self, text, text_night, image, image_night):
        self.text = text
        self.text_night = text_night
        self.image = image
        self.image_night = image_night


def set_city_pic(city: City):
    global image1
    if night_mode.get():
        im = PhotoImage(file=city.image_night)
        text.configure(text=str(city.text_night))
    else:
        im = PhotoImage(file=city.image)
        text.configure(text=str(city.text))

    image1 = im.subsample(2, 2)
    label.configure(image=image1)

Paris = City(q1, q2, "paris_day.png", "paris_night.png")
London = City(w1, w2, "london_day.png", "london_night.png")
Berlin = City(e1, e2, "berlin_day.png", "berlin_night.png")

from tkinter import *

root = Tk()
root.title("Trips")
root.geometry("750x400")
frame = Frame(root, width = 1, height=4)


knopka1=Button(master=frame, text="Paris", command=lambda: set_city_pic(Paris))
knopka1.pack(padx=5, pady=5)
knopka2=Button(master=frame, text="London", command=lambda: set_city_pic(London))
knopka2.pack(padx=5, pady=5)
knopka3=Button(master=frame, text="Berlin", command=lambda: set_city_pic(Berlin))
knopka3.pack(padx=5, pady=5)

night_mode = IntVar()
praporets = Checkbutton(master=frame, text = "Night mode", variable = night_mode, onvalue = 1, offvalue = 0, height=5, width = 20)
praporets.pack(padx=5, pady=5)
frame.pack(side=LEFT)

im = PhotoImage(file=Paris.image)
image1 = im.subsample(2, 2)
label = Label(root,  image=image1)
label.pack(side= LEFT)
text = Label(root)
text.pack(side=LEFT)

root.mainloop()
随梦而飞# 2025-02-14 05:07:11

我认为问题是您的名字惯例。
您可以使用名称为“巴黎”的功能创建一个函数,但随后用您创建的类覆盖变量。
然后,当您将“巴黎”作为按钮的命令传递时,该按钮试图执行“巴黎”,但巴黎是无法执行的对象。这也是您没有错误的原因。

def change(self):
     if result.get() == 1:
         self.text.configure(text=str(self.text_night))
         self.label.configure(image=self.image_night)
     else:
          print('123')

另外,要访问“文本”,就像您想在现在称为函数“ changeparis”中执行的“文本”,您需要使“更改”一种“城市”的方法。那就是为什么您需要将“自我”作为一个论点。

最后但并非最不重要的一点是,您需要将标签的参考等转移到“城市”中,否则您将无法访问它们。

那是我的最终代码:

q1 = """
Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris""" q2 = """Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 """ w1 = """ london london london london london london london london london london london london london london""" w2 = """Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris""" e1 = """Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris""" e2 = """Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris
"""
    
class City():
    """docstring for City"""
    def __init__(self, text, text_night, image, image_night, label, text):
        self.text = text
        self.text_night = text_night
        self.image = image
        self.image_night = image_night
        self.label = label
        self.text = text

    def change(self):
        if result.get() == 1:
            self.text.configure(text=str(self.text_night))
            self.label.configure(image=self.image_night)
        else:
            print("123")
    
from tkinter import * root = Tk() root.title("Trips") root.geometry("750x400") frame = Frame(root, width = 1, height=4)

img = PhotoImage(file = Paris.image) image1 = img.subsample(2, 2) label = Label(root, image=image1).pack(side= LEFT) text = Label(root, text=Paris.text) text.pack(side=LEFT)
    
Paris = City(q1, q2, "london_day.gif", "london_night.gif", label, text) 
London = City(w1, w2, "london_day.gif", "london_night.gif", label, text) 
Berlin = City(e1, e2, "london_day.gif", "london_night.gif", label, text)
    
knopka1=Button(master=frame, text="Paris", command=Paris.change) knopka1.pack(padx=5, pady=5) 
knopka2=Button(master=frame, text="London") 
knopka2.pack(padx=5, pady=5) 
knopka3=Button(master=frame, text="Berlin") 
knopka3.pack(padx=5, pady=5)
    
    result = IntVar() 
praporets = Checkbutton(master=frame, text = "Night mode", variable = result ,onvalue = 1, offvalue = 0, height=5, width = 20) praporets.pack(padx=5, pady=5) 
frame.pack(side=LEFT)
    
root.mainloop()

我尽了最大的努力,但无法测试。请注意。希望我能帮助您!

I think the problem is your name convention.
You create a function with name "Paris" but then overwrite the variable with a class that you create.
Then, when you pass "Paris" as a command for the button, the button tries to execute "Paris", but Paris is an object which can't be executed. That's also the reason why you don't get an error.

def change(self):
     if result.get() == 1:
         self.text.configure(text=str(self.text_night))
         self.label.configure(image=self.image_night)
     else:
          print('123')

Also, to access "text" like you want to do in your now called function "changeParis", you'd need to make "change" a method of "City". Thats, why you need to pass "self" as an argument.

Last but not least, you need to pass your references of your labels etc. into "City" otherwise, you can't access them.

That's my final code:

q1 = """
Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris""" q2 = """Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 Paris1 """ w1 = """ london london london london london london london london london london london london london london""" w2 = """Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris""" e1 = """Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris""" e2 = """Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris Paris
"""
    
class City():
    """docstring for City"""
    def __init__(self, text, text_night, image, image_night, label, text):
        self.text = text
        self.text_night = text_night
        self.image = image
        self.image_night = image_night
        self.label = label
        self.text = text

    def change(self):
        if result.get() == 1:
            self.text.configure(text=str(self.text_night))
            self.label.configure(image=self.image_night)
        else:
            print("123")
    
from tkinter import * root = Tk() root.title("Trips") root.geometry("750x400") frame = Frame(root, width = 1, height=4)

img = PhotoImage(file = Paris.image) image1 = img.subsample(2, 2) label = Label(root, image=image1).pack(side= LEFT) text = Label(root, text=Paris.text) text.pack(side=LEFT)
    
Paris = City(q1, q2, "london_day.gif", "london_night.gif", label, text) 
London = City(w1, w2, "london_day.gif", "london_night.gif", label, text) 
Berlin = City(e1, e2, "london_day.gif", "london_night.gif", label, text)
    
knopka1=Button(master=frame, text="Paris", command=Paris.change) knopka1.pack(padx=5, pady=5) 
knopka2=Button(master=frame, text="London") 
knopka2.pack(padx=5, pady=5) 
knopka3=Button(master=frame, text="Berlin") 
knopka3.pack(padx=5, pady=5)
    
    result = IntVar() 
praporets = Checkbutton(master=frame, text = "Night mode", variable = result ,onvalue = 1, offvalue = 0, height=5, width = 20) praporets.pack(padx=5, pady=5) 
frame.pack(side=LEFT)
    
root.mainloop()

I tried my best, but couldn't test it. Please be aware of this. I hope I could help you!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文