显示方形Tkinter.Button的?

时间:2014-05-17 08:20:06

标签: python tkinter

为什么此代码显示的按钮高于宽?

import Tkinter, tkFont
top = Tkinter.Tk()
right = Tkinter.Frame(top)
right.pack(side = "right")
font = tkFont.Font(family="Helvetica", size=60, weight = tkFont.BOLD)

for i in xrange(6):
    b = Tkinter.Button(right, text = str(i), font = font, width = 1, height = 1)
    top.rowconfigure(i, weight = 1)
    top.columnconfigure(i, weight = 1)
    b.grid(row = i/3, column = i%3, sticky = "NWSE")

top.mainloop()
  • 所有按钮均使用width=1, height=1
  • 创建
  • 对于right的每一行和每一列,都会调用right.rowconfigure(rowi, weight=1)(或columnconfigure)。
  • 每个按钮b的每个网格展示位置均采用粘性NSEW
  • 我设置了right.grid_propagate(0)

我究竟做错了什么?

如果我将按钮直接放在top上,按钮就会变得比高大。它们似乎正在调整大小以适应传播的空间。如何防止此大小调整?

2 个答案:

答案 0 :(得分:5)

如果Button显示文字,则当您使用heightwidth选项时,其单位为文本单位。为了使它们成方形,使用像素单元会更好。要做到这一点,您需要将该按钮放在Frame中,并确保框架不会传播(grid_propagate)并允许其子项填充它(columnconfigure& {{1 }})。

这只是一个例子,因为我没有看到你的代码。

rowconfigure

编辑:我刚看到您的编辑(添加您的代码)。将相同的内容应用到您的代码后;

import Tkinter as tk

master = tk.Tk()

frame = tk.Frame(master, width=40, height=40) #their units in pixels
button1 = tk.Button(frame, text="btn")


frame.grid_propagate(False) #disables resizing of frame
frame.columnconfigure(0, weight=1) #enables button to fill frame
frame.rowconfigure(0,weight=1) #any positive number would do the trick

frame.grid(row=0, column=1) #put frame where the button should be
button1.grid(sticky="wens") #makes the button expand

tk.mainloop()

答案 1 :(得分:3)

另一种方法是欺骗Button认为它显示图像,因此其单位可以用像素而不是文字大小来操纵。

您可以通过创建PhotoImage的空实例,将其设置为按钮的image选项,然后使用按钮的compound选项组合&#来执行此操作34;图像"和文字。以下是使用部分代码的示例:

import Tkinter, tkFont


root = Tkinter.Tk()

font = tkFont.Font(family="Helvetica", size=60, weight = tkFont.BOLD)
blank_image = Tkinter.PhotoImage()

for i in xrange(6):
    b = Tkinter.Button(root, image=blank_image, text=str(i),
                       font=font, compound=Tkinter.CENTER)

    # get the height of the font to use as the square size
    square_size = font.metrics('linespace')
    b.config(width=square_size, height=square_size)

    b.grid(row = i/3, column = i%3, sticky = "NWSE")

root.mainloop()