Python Tkinter单选换背景及点击按钮移动文字功能实现问题求助
问题核心原因
你代码中self.lbl1 = Label(self.canvas, text = "Welcome").place(x = 100, y = 50)写法存在两处错误:
- Tkinter中所有组件布局方法(
pack/grid/place)的返回值均为None,你直接链式调用后self.lbl1实际存储的是空值,后续canvas.move()方法无法找到目标元素 Label是独立组件,放在Canvas上时不属于Canvas的原生绘制元素,Canvas.move()方法仅对Canvas自身创建的图形/文本对象生效
修正方案
把画布上的文本改用Canvas原生的create_text方法创建,修改两处代码即可:
- 替换原Label创建代码:
把self.lbl1 = Label(self.canvas, text = "Welcome").place(x = 100, y = 50)
改为self.txt_id = self.canvas.create_text(100, 50, text="Welcome") - 修改左右移动方法的操作对象:
把processbtLeft和processbtRight方法里的self.lbl1替换为self.txt_id,不需要额外调用canvas.update(),Tkinter事件循环会自动刷新界面。
修正后完整代码
from tkinter import * # Import tkinter class Buttons: def __init__(self): window = Tk() # Create a window window.title("Radio Buttons and Buttons") frame1 = Frame(window) # Create and add a frame to window frame1.pack() self.v1 = IntVar() rbRed = Radiobutton(frame1, text = "Red", variable = self.v1, value=1, command = self.processRb) rbYellow = Radiobutton(frame1, text = "Yellow", variable = self.v1, value=2, command = self.processRb) rbWhite = Radiobutton(frame1, text = "White", variable = self.v1, value=3, command = self.processRb) rbGrey = Radiobutton(frame1, text = "Grey", variable = self.v1, value=4, command = self.processRb) rbGreen = Radiobutton(frame1, text = "green", variable = self.v1, value=5, command = self.processRb) rbRed.grid(row = 1, column = 1) rbYellow.grid(row = 1, column = 2) rbWhite.grid(row = 1, column = 3) rbGrey.grid(row = 1, column = 4) rbGreen.grid(row = 1, column = 5) frame2 = Frame(window, bg = "blue") frame2.pack() self.canvas = Canvas(window) self.canvas.pack() # 改用Canvas原生方法创建文本,拿到元素ID self.txt_id = self.canvas.create_text(100, 50, text="Welcome") frame3 = Frame(window) # Create and add a frame to window frame3.pack() btLeft = Button(frame3, text = "<=", command = self.processbtLeft) btRight = Button(frame3, text = "=>", command = self.processbtRight) btLeft.grid(row = 1, column = 1) btRight.grid(row = 1, column = 2) window.mainloop() # Create an event loop def processbtLeft(self): self.canvas.move(self.txt_id, -10, 0) def processbtRight(self): self.canvas.move(self.txt_id, 10, 0) def processRb(self): if self.v1.get() == 1: self.canvas["bg"] = "red" elif self.v1.get() == 2: self.canvas["bg"] = "yellow" elif self.v1.get() == 3: self.canvas["bg"] = "white" elif self.v1.get() == 4: self.canvas["bg"] = "grey" elif self.v1.get() == 5: self.canvas["bg"] = "green" Buttons()
内容的提问来源于stack exchange,提问作者Amarillo
相关产品推荐
相关产品推荐

