Displaying square Tkinter.Button's?

前端 未结 2 1507
广开言路
广开言路 2020-12-21 02:04

Why does this code display buttons taller than they are wide?

import Tkinter, tkFont
top = Tkinter.Tk()
right = Tkinter.Frame(top)
right.pack(side = \"right\         


        
相关标签:
2条回答
  • 2020-12-21 02:23

    Another method is to trick the Button into thinking it's displaying an image, so its units can be manipulated by pixels instead of text-size.

    You can do this by creating an empty instance of PhotoImage, setting it to the image option of the button, and using the compound option of the button to combine the "image" and text. Here's an example using part of your code:

    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()
    
    0 讨论(0)
  • 2020-12-21 02:47

    If a Button displays text, when you use height and width options, their units in text unit. To make them square, using pixel unit would be better. To do that, you need to place that button in a Frame and make sure frame won't propagate(grid_propagate) and allow its children to fill it (columnconfigure & rowconfigure).

    This is just an example, since I don't see your code.

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

    EDIT: I just saw your edit(adding your code). After applying same things to your code;

    import Tkinter, tkFont
    top = Tkinter.Tk()
    right = Tkinter.Frame(top)
    right.pack(side = "right")
    font = tkFont.Font(family="Helvetica", size=20, weight = tkFont.BOLD)
    
    for i in xrange(6):
        f = Tkinter.Frame(right,width=50,height=50)
        b = Tkinter.Button(f, text = str(i), font = font)
    
        f.rowconfigure(0, weight = 1)
        f.columnconfigure(0, weight = 1)
        f.grid_propagate(0)
    
        f.grid(row = i/3, column = i%3)
        b.grid(sticky = "NWSE")
    
    top.mainloop()
    
    0 讨论(0)
提交回复
热议问题