在tkinter, python中,当标签的大小改变时,窗口的大小也会改变



所以我做了一个tkinter计算器,当我按下数字时,标签显示数字。唯一的问题是,当标签的宽度增加时,它会导致窗口的宽度也发生变化。当我按数字时,是否有一种方法可以保持向左而不是向右增加标签的长度?代码如下-

from tkinter import *
FONT_NAME = "Courier"
val = ""

# ---------------------Functionality------------
def seven_is_clicked():
global val
val += "7"
solution_label.config(text=val)

def eight_is_clicked():
global val
val += "8"
solution_label.config(text=val)

def nine_is_clicked():
global val
val += "9"
solution_label.config(text=val)

def four_is_clicked():
global val
val += "4"
solution_label.config(text=val)

def five_is_clicked():
global val
val += "5"
solution_label.config(text=val)

def six_is_clicked():
global val
val += "6"
solution_label.config(text=val)

def one_is_clicked():
global val
val += "1"
solution_label.config(text=val)

def two_is_clicked():
global val
val += "2"
solution_label.config(text=val)

def three_is_clicked():
global val
val += "3"
solution_label.config(text=val)

def zero_is_clicked():
global val
val += "0"
solution_label.config(text=val)

# ---------------------UX------------------------

window = Tk()
window.config()
window.title("Calculator")
window.minsize()
window.resizable(0, 0)

solution_label = Label(text="0", height=2, font=(FONT_NAME, 30), bg="pink", anchor="e")
solution_label.grid(column=3, row=0)
AC_button = Button(text="AC", width=6, height=2, padx=7, pady=7, highlightthickness=0)
AC_button.grid(column=0, row=1, padx=3, pady=3)
division_button = Button(text="/", width=6, height=2, padx=7, pady=7, highlightthickness=0)
division_button.grid(column=1, row=1, padx=3, pady=3)
multiplication_button = Button(text="*", width=6, height=2, padx=7, pady=7, highlightthickness=0)
multiplication_button.grid(column=2, row=1, padx=3, pady=3)
subtraction_button = Button(text="-", width=6, height=2, padx=7, pady=7, highlightthickness=0)
subtraction_button.grid(column=3, row=1, padx=3, pady=3)
seven_button = Button(text="7", width=6, height=2, padx=7, pady=7, highlightthickness=0, command=seven_is_clicked)
seven_button.grid(column=0, row=2, padx=3, pady=3)
eight_button = Button(text="8", width=6, height=2, padx=7, pady=7, highlightthickness=0, command=eight_is_clicked)
eight_button.grid(column=1, row=2, padx=3, pady=3)
nine_button = Button(text="9", width=6, height=2, padx=7, pady=7, highlightthickness=0, command=nine_is_clicked)
nine_button.grid(column=2, row=2, padx=3, pady=3)
plus_button = Button(text="+", width=6, height=6, padx=7, pady=7, highlightthickness=0)
plus_button.grid(column=3, row=2, rowspan=2, padx=3, pady=3)
four_button = Button(text="4", width=6, height=2, padx=7, pady=7, highlightthickness=0, command=four_is_clicked)
four_button.grid(column=0, row=3, padx=3, pady=3)
five_button = Button(text="5", width=6, height=2, padx=7, pady=7, highlightthickness=0, command=five_is_clicked)
five_button.grid(column=1, row=3, padx=3, pady=3)
six_button = Button(text="6", width=6, height=2, padx=7, pady=7, highlightthickness=0, command=six_is_clicked)
six_button.grid(column=2, row=3, padx=3, pady=3)
one_button = Button(text="1", width=6, height=2, padx=7, pady=7, highlightthickness=0, command=one_is_clicked)
one_button.grid(column=0, row=4, padx=3, pady=3)
two_button = Button(text="2", width=6, height=2, padx=7, pady=7, highlightthickness=0, command=two_is_clicked)
two_button.grid(column=1, row=4, padx=3, pady=3)
three_button = Button(text="3", width=6, height=2, padx=7, pady=7, highlightthickness=0, command=three_is_clicked)
three_button.grid(column=2, row=4, padx=3, pady=3)
equal_button = Button(text="=", width=6, height=6, padx=7, pady=7, highlightthickness=0)
equal_button.grid(column=3, row=4, rowspan=2, padx=3, pady=3)
delete_button = Button(text="Del", width=6, height=2, padx=7, pady=7, highlightthickness=0)
delete_button.grid(column=0, row=5, padx=3, pady=3)
zero_button = Button(text="0", width=6, height=2, padx=7, pady=7, highlightthickness=0, command=zero_is_clicked)
zero_button.grid(column=1, row=5, padx=3, pady=3)
decimal_button = Button(text=".", width=6, height=2, padx=7, pady=7, highlightthickness=0)
decimal_button.grid(column=2, row=5, padx=3, pady=3)
window.mainloop()

答案如下(注释中有解释):

from tkinter import Tk, Button, Label
FONT_NAME = "Courier"
# ---------------------UX------------------------
window = Tk()
window.config()
window.title("Calculator")
window.minsize()
window.resizable(0, 0)

solution_label = Label(text="0", height=2, font=(FONT_NAME, 30), bg="pink", anchor="e")
# added columnspan, changed column to 0 and set sticky to east, now this means that text will go to the right
# because of the columnspan and changed row, you can change sticky to `nsew` if you want the
# label to cover all sides
solution_label.grid(column=0, row=0, columnspan=4, sticky='e')
# this is the loop for creating the number buttons
row = 0
column = 0
for num in range(1, 10):
def add_num(number=num):
if solution_label['text'] == '0':
solution_label['text'] = ''
solution_label['text'] += str(number)
Button(
window, text=num, width=6, height=2, padx=7, pady=7, highlightthickness=0, command=add_num
).grid(row=row + 2, column=column)
column += 1
if column > 2:
column = 0
row += 1
# separate creation for zero because the row is not shared with any other widgets
# that can be solved by creating a list with button names and iterating over that
# that way you can create all buttons in a loop (not all functions can be defined in loop however)
Button(
window, text='0', width=6, height=2, padx=7, pady=7, highlightthickness=0, command=lambda: add_num(0)
).grid(row=5, column=1)
AC_button = Button(text="AC", width=6, height=2, padx=7, pady=7, highlightthickness=0)
AC_button.grid(column=0, row=1, padx=3, pady=3)
division_button = Button(text="/", width=6, height=2, padx=7, pady=7, highlightthickness=0)
division_button.grid(column=1, row=1, padx=3, pady=3)
multiplication_button = Button(text="*", width=6, height=2, padx=7, pady=7, highlightthickness=0)
multiplication_button.grid(column=2, row=1, padx=3, pady=3)
subtraction_button = Button(text="-", width=6, height=2, padx=7, pady=7, highlightthickness=0)
subtraction_button.grid(column=3, row=1, padx=3, pady=3)
plus_button = Button(text="+", width=6, height=6, padx=7, pady=7, highlightthickness=0)
plus_button.grid(column=3, row=2, rowspan=2, padx=3, pady=3)
equal_button = Button(text="=", width=6, height=6, padx=7, pady=7, highlightthickness=0)
equal_button.grid(column=3, row=4, rowspan=2, padx=3, pady=3)
delete_button = Button(text="Del", width=6, height=2, padx=7, pady=7, highlightthickness=0)
delete_button.grid(column=0, row=5, padx=3, pady=3)
decimal_button = Button(text=".", width=6, height=2, padx=7, pady=7, highlightthickness=0)
decimal_button.grid(column=2, row=5, padx=3, pady=3)

# these two lines set window geometry so that it will not automatically resize to fit widgets
window.update_idletasks()
window.geometry(window.geometry())
window.mainloop()

几何部分是最后4到3行,它不允许窗口自动调整大小

最新更新