Tkinter应用启动后按钮不显示,使用.place放置到self.frame问题求助
错误点说明
- 菜单配置逻辑错误:
master.configure(menu=self)写法不符合tkinter规范,menu参数需要传入Menu实例,此处传入WindowMain类实例会直接抛出异常,中断组件初始化流程;同时菜单实例menuleiste的父容器设置为Frame,无法绑定到窗口顶部菜单栏,正确父容器应为根窗口master。 - 回调引用指向错误:按钮command属性中写的
lambda:[button_ust()],此处button_ust指向的是刚定义的局部按钮对象,不是类方法self.button_ust,按钮对象不可调用会触发运行时错误;另外button_bestand()没有对应的类方法定义,也会导致程序崩溃。 - 子窗口方法调用错误:WindowUSt类中直接调用
self.geometry()、self.resizable()属于错误用法,self是自定义类的实例,不是Toplevel窗口对象,需要通过持有窗口实例的self.master调用窗口相关方法。 - 布局管理器冲突:WindowUSt类中给
fileButton同时调用了pack()和place()两种布局方法,同一个组件只能使用一种布局管理器,冲突会导致组件无法渲染。 - 组件父容器非法:WindowUSt类中定义
fileButton时传入的父容器是self,父容器必须是tkinter原生容器类对象(Tk、Frame、Toplevel等),自定义类实例不能作为组件父容器。
修正后可运行代码
import tkinter as tk class WindowMain: def __init__(self, master): self.master = master self.frame = tk.Frame(self.master, width=550, height=280) # 修正菜单父容器和配置逻辑 menuleiste = tk.Menu(master) datei_menu = tk.Menu(menuleiste, tearoff=0) datei_menu.add_command(label="Einlesen", command=self.button_ust) menuleiste.add_cascade(label="Datei", menu=datei_menu) master.configure(menu=menuleiste) # 修正回调指向,新增缺失的bestand按钮方法引用 button_ust = tk.Button(self.frame, text='Umsatz/Steuer\n Auswertung', command=self.button_ust, bg='#393939', fg='white') button_ust.place(x = 60, y = 40, width=200, height=75) bestand_button = tk.Button(self.frame, text='Lagerbestand\n auswerten', command=self.button_bestand, bg='#393939', fg='white') bestand_button.place(x = 290, y = 40, width=200, height=75) self.frame.pack() def button_ust(self): self.button_ust_win = tk.Toplevel(self.master) self.app = WindowUSt(self.button_ust_win) # 补全缺失的库存按钮方法 def button_bestand(self): # 可根据需求补充逻辑 pass class WindowUSt: def __init__(self, master): self.master = master self.frame = tk.Frame(self.master, width=400, height=100) # 修正窗口方法调用 self.master.geometry('400x100') self.master.resizable(False,False) # 修正父容器和布局冲突 fileButton = tk.Button(self.frame, text='Datei suchen') fileButton.place(x=280, y=22, height=40, width=100) self.frame.pack() def main(): root = tk.Tk() app = WindowMain(root) root.geometry('550x280') root.resizable(False,False) root.mainloop() if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者For My
相关产品推荐
相关产品推荐

