Как создать кнопку на холсте tkinter?
Я создал рамку, а затем на холст.
Что я хочу сделать дальше, так это добавить кнопку на холст.
Однако, когда я упаковал кнопку, Я не вижу холст!
вот что я пробовал:
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()
3 ответов
В 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)
относительно холста, без изменения размера самого холста.
обратите внимание, что вы можете заменить
вы можете использовать кнопки button1.поместите (x=0, y=0) диспетчер геометрии вместо пакета (side =TOP) пакет изменить размер главного виджета, чтобы сделать его достаточно большим, чтобы держать дочерний виджет
http://effbot.org/tkinterbook/pack.htm#Tkinter.Pack.pack_propagate-method
У меня была точно такая же проблема. Я не знаю официального способа, но вот способ обойти это:
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()