【问题标题】:When the size of label changes, the size of the window changes as well in tkinter, python当标签的大小发生变化时,窗口的大小也会在 tkinter、python 中发生变化
【发布时间】:2021-08-13 19:42:56
【问题描述】:

所以我做了一个 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()

【问题讨论】:

  • 添加window.geometry("widthxheight")设置窗口的宽高。
  • 首先你应该对所有按下的数字使用like一个函数,只需将按下的数字作为参数传递(基本的python东西)(然后将命令添加到按钮,你可能需要使用@ 987654323@) 并且如果您想争辩说您刚刚开始使用 python:如果您刚刚开始使用 python 并不重要,如果您这样做了,那么当您应该首先学习基础知识时,您已经在使用 GUI 做什么了。问题是,如果有很多重复的代码(比如这种情况),那么很可能有一种方法可以减少该代码。还学习如何在循环中创建按钮
  • 你也应该指定主参数,你可能想要做的是这样做:solution_label.grid(column=0, row=0, columnspan=4, sticky='e')

标签: python user-interface tkinter


【解决方案1】:

这是答案(用 cmets 解释):

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行,它不允许窗口自动调整大小

【讨论】:

  • 谢谢@Matiiss。你肯定帮助我学到了很多东西。我一定会更多地研究我的基础知识。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
相关资源
最近更新 更多