1 回答

TA貢獻1946條經驗 獲得超3個贊
您可能應該了解如何使用類,但這里有一個有關如何在給定代碼中使用類的示例。
from tkinter import *
class TrafficLights:
def value(self):
root = Tk()
frame = Frame(root)
frame.pack()
self.color = StringVar()
radio_red = Radiobutton(frame, text="Red", bg="red", variable= self.color, value="R", command= self.on_RadioChange)
radio_red.grid(row=10, column=1)
radio_yellow = Radiobutton(frame, text="Yellow", bg="yellow", variable= self.color, value="Y", command= self.on_RadioChange)
radio_yellow.grid(row = 10, column = 2)
radio_green = Radiobutton(frame, text="Green", bg="green", variable= self.color, value="G", command= self.on_RadioChange)
radio_green.grid(row = 10, column = 3)
self.canvas = Canvas(root, width=450, height=300, bg="white")
self.canvas.pack()
self.oval_red = self.canvas.create_oval(10, 10, 110, 110, fill="white")
self.oval_yellow = self.canvas.create_oval(120, 10, 220, 110, fill="white")
self.oval_green = self.canvas.create_oval(230, 10, 330, 110, fill="white")
self.color.set('R')
self.canvas.itemconfig(self.oval_red, fill="red")
root.mainloop()
def on_RadioChange(self):
color = self.color.get()
if color == 'R':
self.canvas.itemconfig(self.oval_red, fill="red")
self.canvas.itemconfig(self.oval_yellow, fill="white")
self.canvas.itemconfig(self.oval_green, fill="white")
elif color == 'Y':
self.canvas.itemconfig(self.oval_red, fill="white")
self.canvas.itemconfig(self.oval_yellow, fill="yellow")
self.canvas.itemconfig(self.oval_green, fill="white")
elif color == 'G':
self.canvas.itemconfig(self.oval_red, fill="white")
self.canvas.itemconfig(self.oval_yellow, fill="white")
self.canvas.itemconfig(self.oval_green, fill="green")
a = TrafficLights()
a.value()
主要錯誤是您沒有使用self也沒有調用該方法value()。所以我修復了所有這些。因此,如果您不想調用value(),那么您可以將 Changedef value(self)與 def 一起使用__init__(self):,這樣您現在就不必調用了a.value()。我建議您在繼續學習 python 和 tkinter 課程之前先學習更多有關 OOP 的知識。
更新:
沒有什么太大的問題,只是重新排列代碼并將color內部函數更改為colors其他內容,完成的代碼將是:
from tkinter import *
root = Tk()
def on_RadioChange():
colors = color.get()
if colors == 'R':
canvas.itemconfig('oval_red', fill="red")
canvas.itemconfig('oval_yellow', fill="white")
canvas.itemconfig('oval_green', fill="white")
elif colors == 'Y':
canvas.itemconfig('oval_red', fill="white")
canvas.itemconfig('oval_yellow', fill="yellow")
canvas.itemconfig('oval_green', fill="white")
elif colors == 'G':
canvas.itemconfig('oval_red', fill="white")
canvas.itemconfig('oval_yellow', fill="white")
canvas.itemconfig('oval_green', fill="green")
frame = Frame(root)
frame.pack()
color = StringVar()
radio_red = Radiobutton(frame, text="Red", bg="red", variable=color, value="R", command=on_RadioChange)
radio_red.grid(row=10, column=1)
radio_yellow = Radiobutton(frame, text="Yellow", bg="yellow", variable=color, value="Y", command=on_RadioChange)
radio_yellow.grid(row = 10, column = 2)
radio_green = Radiobutton(frame, text="Green", bg="green", variable=color, value="G", command=on_RadioChange)
radio_green.grid(row = 10, column = 3)
canvas = Canvas(root, width=450, height=300, bg="white")
canvas.pack()
canvas.create_oval(10, 10, 110, 110, fill="white",tag='oval_red')
canvas.create_oval(120, 10, 220, 110, fill="white",tag='oval_yellow')
canvas.create_oval(230, 10, 330, 110, fill="white",tag='oval_green')
color.set('R')
canvas.itemconfig('oval_red', fill="red")
root.mainloop()
為什么color要改為colors?當您使用color實際引用colorwith時color,這會引發一個UnboundLocalError: local variable 'color' referenced before assignment(因為它在函數內部?),因此要擺脫它,只需重命名(僅在這種情況下)。這是最好的方法嗎?我不這么認為,您可以在這里刪除一些無用的變量。
添加回答
舉報