Python画布和网格Tkinter

3
我想在一个网格中放置画布,但我想将输入和标签与画布分开,以便我可以放置画布而不干扰输入和标签,使其看起来“可爱”。如果我现在将画布放在第0行第3列,那么将会有一个巨大的空间,如果周围还有其他小部件,它要么留下一个大的空白区域,要么让小部件变长。我想把画布放在右边,其他小部件放在左边,而不是在任何地方留下大的空隙。
任何帮助都将不胜感激。
    import tkinter as tk
    from tkinter import *
    class Gui():
        def __init__(self, root):
            self.root=root
            self.entry = tk.Entry(root)
            stvar=tk.StringVar()
            stvar.set("one")
            self.option=tk.OptionMenu(root, stvar, "one", "two", "three")

            self.canvas=tk.Canvas(root, width=300, height=200, background='white')
            self.canvas.grid(row=0,column=2)
            label1=Label(self.root, text="Figure").grid(row=0,column=0, sticky="nw")
            label2=Label(self.root, text="X").grid(row=1,column=0, sticky="w")
            label3=Label(self.root, text="Y").grid(row=2,column=0, sticky="w")
            self.option.grid(row=0,column=1,sticky="nwe")
            entry = Entry(self.root).grid(row = 1,column = 1,sticky = E+ W)
            entry1 = Entry(self.root).grid(row = 2,column = 1, sticky = E)
            Button1=Button(self.root,text="Draw").grid(row = 3,column = 1, sticky = "we")
            figure1=self.canvas.create_rectangle(80, 80, 120, 120, fill="blue")

            #Grid.columnconfigure(self.root,1,weight=1, size=200)
    if __name__== '__main__':
        root=tk.Tk()
        gui=Gui(root)
        root.mainloop()
1个回答

6
您可以创建一个Frame,并将所有非画布小部件放入其中。它们在框架的网格中的位置将忽略框架外的小部件的定位。
import tkinter as tk
from tkinter import *
class Gui():
    def __init__(self, root):
        self.root=root
        self.entry = tk.Entry(root)
        stvar=tk.StringVar()
        stvar.set("one")

        self.canvas=tk.Canvas(root, width=300, height=200, background='white')
        self.canvas.grid(row=0,column=1)

        frame = Frame(self.root)
        frame.grid(row=0,column=0, sticky="n")

        self.option=tk.OptionMenu(frame, stvar, "one", "two", "three")
        label1=Label(frame, text="Figure").grid(row=0,column=0, sticky="nw")
        label2=Label(frame, text="X").grid(row=1,column=0, sticky="w")
        label3=Label(frame, text="Y").grid(row=2,column=0, sticky="w")
        self.option.grid(row=0,column=1,sticky="nwe")
        entry = Entry(frame).grid(row = 1,column = 1,sticky = E+ W)
        entry1 = Entry(frame).grid(row = 2,column = 1, sticky = E)
        Button1=Button(frame,text="Draw").grid(row = 3,column = 1, sticky = "we")
        figure1=self.canvas.create_rectangle(80, 80, 120, 120, fill="blue")

        #Grid.columnconfigure(self.root,1,weight=1, size=200)
if __name__== '__main__':
    root=tk.Tk()
    gui=Gui(root)
    root.mainloop()

Result:

enter image description here


1
你好,Kevin。很好的例子。我是Python/Tkinter的初学者,请问你能否解释一下为什么它被推崇为面向对象编程的方法(定义一个类并在其中放置小部件),而不是只创建没有类的小部件? - Kennedy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接