仅在tkinter窗口中创建一个画布

0 投票
1 回答
4182 浏览
提问于 2025-04-16 06:55

如果我试着在一个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()

另外,如果我把创建画布的函数注释掉了,我之前用self.grid_forget()移除的按钮也不会消失。有没有更好的方法来处理这个问题呢?

1 个回答

6

问题在于你在同一个窗口里混用了不同的布局管理器。每个父控件只能使用一种布局管理器。虽然在整个应用程序中你可以同时使用两种布局管理器,但在同一个父控件下的子控件中,你只能选择一种。

你需要重新写代码,只用一种布局管理器,比如全部使用 grid,或者全部使用 pack,来管理根窗口下的所有控件。

使用 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()

撰写回答