繁体   English   中英

在Tkinter窗口中只是一块画布

[英]just a canvas in a tkinter window

如果我尝试将画布放置在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()删除的按钮不会消失。 有一个更好的方法吗?

问题是您在同一窗口中混合了几何图形管理器。 您只能在给定的父窗口小部件中使用一个。 您可以在整个应用程序中同时使用它们,但是您要在具有相同父项的小部件上同时使用它们。

您需要重写代码,以仅对直接在根窗口下的所有小部件使用网格或仅打包。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM