Python Tkinter中调用show()无法切换Label Grid行的问题及解决
问题描述
我尝试用Python Tkinter创建终端风格GUI,已经能从TextFrame类中访问tk.Label,但调用Instances类的show()函数时,无法每次切换Label所在的Grid行——每次回车只会更新同一个Label的内容,不会在新行显示新输入的内容。
原核心代码片段:TextFrame类初始化时创建单个Label:
class TextFrame(tk.Frame): def __init__(self, container): super().__init__() self.container = container self['bg']='black' self.pack(fill='both', expand=True) self.label = tk.Label(self)
Instances类的show()函数尝试更新Label位置:
def show(self, e): textvar = self.string.get() self.entry_frame.entry.delete(0, 'end') self.text_frame.label.config(text=textvar) self.text_frame.label.grid(column=0, row=self.index_row, sticky="w") self.index_row += 1
完整问题代码:
import tkinter as tk class Window(tk.Tk): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.geometry('800x600') self.title('Terminal') class Instances(Window): def __init__(self): super().__init__() self.string = tk.StringVar() self.index_row = 0 self.text_frame = TextFrame(self) self.text_frame.pack() self.entry_frame = EntryFrame(self) self.entry_frame.pack(side='bottom',fill='both') def show(self, e): textvar = self.string.get() self.entry_frame.entry.delete(0, 'end') self.text_frame.label.config(text=textvar) self.text_frame.label.grid(column=0, row=self.index_row, sticky="w") self.index_row += 1 class TextFrame(tk.Frame): def __init__(self, container): super().__init__() self.container = container self['bg']='black' self.pack(fill='both', expand=True) self.label = tk.Label(self) class EntryFrame(tk.Frame): def __init__(self, container): super().__init__() self.entry = tk.Entry(self, textvariable=container.string) self.entry.pack(fill='both') self.entry.bind('<Return>', container.show) if __name__ == '__main__': window = Instances() window.mainloop()
问题原因
原代码中只创建了一个Label组件,每次调用show()时只是修改这个Label的文本内容并改变它的Grid行位置,本质是移动同一个组件,而非在新行创建新的Label,所以无法实现多行显示的效果。
解决方案
在show()函数中,每次触发回车事件时创建新的Label实例,而不是复用已有的Label。修改后的show()函数如下:
def show(self, e): textvar = self.string.get() self.entry_frame.entry.delete(0, 'end') # 每次创建新的Label,指定父容器和样式 self.text_frame.label = tk.Label(self.text_frame, fg='green', bg='black') self.text_frame.label.config(text=textvar) if len(textvar) > 0 : self.text_frame.label.grid(column=0, row=self.index_row, sticky="w") self.index_row += 1
这样每次回车都会生成一个新的Label,将其放置在递增的Grid行中,从而实现终端风格的多行输出效果。
内容的提问来源于stack exchange,提问作者Joshua Gulbin
相关产品推荐
相关产品推荐

