如何在tkinter Canvas上创建Button?

Ton*_*ony 7 python user-interface tkinter button

我创建了一个Frame,然后创建了一个Canvas.
我接下来要做的是在画布上添加一个Button.
但是,当我打包按钮时,我看不到画布!

这是我尝试过的:

from Tkinter import Tk, Canvas, Frame, Button
from Tkinter import BOTH, W, NW, SUNKEN, TOP, X, FLAT, LEFT

class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("Layout Test")
        self.config(bg = '#F0F0F0')
        self.pack(fill = BOTH, expand = 1)
                #create canvas
        canvas1 = Canvas(self, relief = FLAT, background = "#D2D2D2",
                                            width = 180, height = 500)
        canvas1.pack(side = TOP, anchor = NW, padx = 10, pady = 10)
        #add quit button
        button1 = Button(canvas1, text = "Quit", command = self.quit,
                                                            anchor = W)
        button1.configure(width = 10, activebackground = "#33B5E5",
                                                        relief = FLAT)
        button1.pack(side = TOP)

def main():
    root = Tk()
    root.geometry('800x600+10+50')
    app = Example(root)
    app.mainloop()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

ato*_*inf 14

Tkinter pack管理器尝试将父窗口小部件的大小调整为正确的大小以包含其子窗口小部件,默认情况下不会更大.所以画布就在那里 - 但它与按钮的尺寸完全相同,因而看不见.

如果要在窗体上放置窗口小部件而不使画布动态调整大小,则需要以下Canvas.create_window()函数:

# ... snip ...
button1 = Button(self, text = "Quit", command = self.quit, anchor = W)
button1.configure(width = 10, activebackground = "#33B5E5", relief = FLAT)
button1_window = canvas1.create_window(10, 10, anchor=NW, window=button1)
Run Code Online (Sandbox Code Playgroud)

这将创建(10, 10)相对于画布的左上角按钮,而不会调整画布本身的大小.

请注意,您可以window使用对任何其他Tkinter小部件的引用替换该参数.但有一点需要注意:命名小部件必须是包含画布的顶级窗口的子级,或者是位于同一顶级窗口中的某个小部件的子级.