如果我尝试在tkinter窗口中放置画布而不使用此代码:
from tkinter import ttk
from tkinter import *
from tkinter.ttk import *
class Application(Frame):
def createWidgets(self):
self.can = Canvas(self.master, width=500, height=250)
self.can.grid(row=2, column=1)
self.can.create_line(0,0,500,200)
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()
root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()
永远不会创建窗口。我发现添加一个按钮来创建一个画布:
from tkinter import ttk
from tkinter import *
from tkinter.ttk import *
class Application(Frame):
def makecanvas(self):
self.grid_forget()
self.can = Canvas(self.master, width=500, height=250)
self.can.grid(row=2, column=1)
self.can.create_line(0,0,500,200)
def createWidgets(self):
self.inst = Button(self)
self.inst["text"] = "GO!"
self.inst["command"] = self.makecanvas
self.inst.grid(row=3, column=1, pady=15, sticky=N)
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()
root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()
另外,如果我注释掉了create canvas函数,我用self.grid_forget()删除的按钮不会消失。有更好的方法吗?
答案 0 :(得分:6)
问题是您在同一窗口中混合几何管理器。您只能在给定的父窗口小部件中使用一个。您可以在整个应用程序中使用它们,但是在具有相同父级的小部件上使用它们。
您需要重写代码,仅对根窗口下的所有小部件使用网格或仅包装。
使用 grid
几何管理器
from tkinter import ttk
from tkinter import *
from tkinter.ttk import *
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.grid()
self.createWidgets()
def createWidgets(self):
self.can = Canvas(self.master, width=500, height=250)
self.can.grid(row=2, column=1)
self.can.create_line(0,0,500,200)
root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()
或使用 pack
几何管理器
from tkinter import ttk
from tkinter import *
from tkinter.ttk import *
class Application(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.pack()
self.createWidgets()
def createWidgets(self):
self.can = Canvas(self.master, width=500, height=250)
self.can.pack()
self.can.create_line(0,0,500,200)
root = Tk()
app = Application(master=root)
app.mainloop()
root.destroy()