你如何在 tkinter 画布上创建一个按钮?

Posted

技术标签:

【中文标题】你如何在 tkinter 画布上创建一个按钮?【英文标题】:How do you create a Button on a tkinter Canvas? 【发布时间】:2012-08-12 10:15:49 【问题描述】:

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

这是我尝试过的:

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

【问题讨论】:

【参考方案1】:

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)

这将创建您的按钮,其相对于画布的左上角位于(10, 10),而无需调整画布本身的大小。

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

【讨论】:

【参考方案2】:

您可以使用 button1.place(x=0,y=0) 几何管理器代替 pack(side =TOP) pack 调整主小部件的大小以使其足够大以容纳子小部件

http://effbot.org/tkinterbook/pack.htm#Tkinter.Pack.pack_propagate-method

http://effbot.org/tkinterbook/place.htm

【讨论】:

【参考方案3】:

我遇到了完全相同的问题。我知道没有官方的方法,但这里有一个解决方法:

from Tkinter import *
root = Tk()
def clicked(event):
    print("pressed")
canvas1 = Canvas(root, relief = FLAT, background = "#D2D2D2")
canvas1.pack()
buttonBG = canvas1.create_rectangle(0, 0, 100, 30, fill="grey40", outline="grey60")
buttonTXT = canvas1.create_text(50, 15, text="click")
canvas1.tag_bind(buttonBG, "<Button-1>", clicked) ## when the square is clicked runs function "clicked".
canvas1.tag_bind(buttonTXT, "<Button-1>", clicked) ## same, but for the text.
root.mainloop()

【讨论】:

以上是关于你如何在 tkinter 画布上创建一个按钮?的主要内容,如果未能解决你的问题,请参考以下文章

画布上的 tkinter 菜单栏

Python,Tkinter:如何在可滚动画布上获取坐标

如何从锚点旋转 tkinter 画布小部件?

如何在 tkinter 上制作响应式画布?

如何清除 Tkinter 画布?

如何制作带圆角的 tkinter 画布矩形?