Python Tkinter 条目未放置

Python Tkinter Entry not placing

在克罗地亚,我们举办应用程序竞赛。我正在制作一个应用程序来帮助一年级和二年级学生学习和复习数学。我最近才开始,所以它几乎没有任何东西。 问题是当 variable: mode = "number" 时,没有放置条目。 顺便说一句,打开应用程序时,您将看到 4 个选项。 它们是加法、减法、乘法和除法。 我把它从克罗地亚语翻译成英语,这样你就可以理解了。 当你 运行 程序按下添加按钮。 然后您将看到任务但缺少条目。 如果将变量 mode 的值更改为 mode = "result",则会放置条目。 我尝试了所有方法,但无法正常工作。

代码如下:

import tkinter as tk
import random

wn = tk.Tk()
wn.config(width = 550, height = 500)
wn.resizable(False, False)
wn.title("Learn and Revise")

number1_1 = 0
number1_2 = 0
number2_1 = 0
number2_2 = 0
number3_1 = 0
number3_2 = 0
number4_1 = 0
number4_2 = 0
number5_1 = 0
number5_2 = 0

def makeRandomNumbers():

    global number1_1, number1_2
    global number2_1, number2_2
    global number3_1, number3_2
    global number4_1, number4_2
    global number5_1, number5_2

    if mode == "number":
        while True:
            number1_1 = random.randint(0, 10)
            number1_2 = random.randint(0, 10)
            if number1_1 > number1_2:
                pass
            else:
                break
        while True:
            number2_1 = random.randint(0, 10)
            number2_2 = random.randint(0, 10)
            if number2_1 > number2_2:
                pass
            else:
                break
        while True:
            number3_1 = random.randint(0, 10)
            number3_2 = random.randint(0, 10)
            if number3_1 > number3_2:
                pass
            else:
                break
        while True:
            number4_1 = random.randint(0, 10)
            number4_2 = random.randint(0, 10)
            if number4_1 > number4_2:
                pass
            else:
                break
        while True:
            number5_1 = random.randint(0, 10)
            number5_2 = random.randint(0, 10)
            if number5_1 > number5_2:
                pass
            else:
                break
    elif mode == "result":
        number1_1 = random.randint(0, 10)
        number1_2 = random.randint(0, 10)
        number2_1 = random.randint(0, 10)
        number2_2 = random.randint(0, 10)
        number3_1 = random.randint(0, 10)
        number3_2 = random.randint(0, 10)
        number4_1 = random.randint(0, 10)
        number4_2 = random.randint(0, 10)
        number5_1 = random.randint(0, 10)
        number6_2 = random.randint(0, 10)

def placeTasks(oper):

    global operation
    operation = oper

    makeTasks()

    wipeMenu()

    button_check.place(x = 310, y = 225)
    label1.place(x = 150, y = 125)
    label2.place(x = 150, y = 175)
    label3.place(x = 150, y = 225)
    label4.place(x = 150, y = 275)
    label5.place(x = 150, y = 325)

    if mode == "number":
        entry1.place(x = 240, y = 130)
        entry2.place(x = 240, y = 180)
        entry3.place(x = 240, y = 230)
        entry4.place(x = 240, y = 280)
        entry5.place(x = 240, y = 330)

    elif mode == "result":
        entry1.place(x = 240, y = 130)
        entry2.place(x = 240, y = 180)
        entry3.place(x = 240, y = 230)
        entry4.place(x = 240, y = 280)
        entry5.place(x = 240, y = 330)

task1 = 0
task2 = 0
task3 = 0
task4 = 0
task5 = 0

def makeTasks():

    global task1, task2, task3, task4, task5
    global label1, label2, label3, label4, label5

    makeRandomNumbers()

    operation_sign = ""
    if operation == "addition":
        operation_sign = '+'
    elif operation == "subtraction":
        operation_sign = '-'
    elif operation == "multiplication":
        operation_sign = '•'
    elif operation == "division":
        operation_sign = '÷'

    if mode == "result":
        task1 = "{} {} {} =".format(number1_1, operation_sign, number1_2)
        task2 = "{} {} {} =".format(number2_1, operation_sign, number2_2)
        task3 = "{} {} {} =".format(number3_1, operation_sign, number3_2)
        task4 = "{} {} {} =".format(number4_1, operation_sign, number4_2)
        task5 = "{} {} {} =".format(number5_1, operation_sign, number5_2)
    elif mode == "number":
        task1 = "{} {}            = {}".format(number1_1, operation_sign, number1_2)
        task2 = "{} {}            = {}".format(number2_1, operation_sign, number2_2)
        task3 = "{} {}            = {}".format(number3_1, operation_sign, number3_2)
        task4 = "{} {}            = {}".format(number4_1, operation_sign, number4_2)
        task5 = "{} {}            = {}".format(number5_1, operation_sign, number5_2)

    label1 = tk.Label(wn, text = task1, font = ("Arial", 15))
    label2 = tk.Label(wn, text = task2, font = ("Arial", 15))
    label3 = tk.Label(wn, text = task3, font = ("Arial", 15))
    label4 = tk.Label(wn, text = task4, font = ("Arial", 15))
    label5 = tk.Label(wn, text = task5, font = ("Arial", 15))

operation = ""
mode = "number"

button_check = tk.Button(wn, width = 20, text = "Check")

label1 = tk.Label(wn, text = task1, font = ("Arial", 15))
entry1 = tk.Entry(wn, width = 7)

label2 = tk.Label(wn, text = task2, font = ("Arial", 15))
entry2 = tk.Entry(wn, width = 7)

label3 = tk.Label(wn, text = task3, font = ("Arial", 15))
entry3 = tk.Entry(wn, width = 7)

label4 = tk.Label(wn, text = task4, font = ("Arial", 15))
entry4 = tk.Entry(wn, width = 7)

label5 = tk.Label(wn, text = task5, font = ("Arial", 15))
entry5 = tk.Entry(wn, width = 7)


def placeMenu():

    menu_label1.place(x = 175, y = 75)
    button1.place(x = 200, y = 150)
    button2.place(x = 200, y = 200)
    button3.place(x = 200, y = 250)
    button4.place(x = 200, y = 300)

def wipeMenu():

    menu_label1.destroy()
    button1.destroy()
    button2.destroy()
    button3.destroy()
    button4.destroy()

menu_label1 = tk.Label(wn, text = "Revise", font = ("Arial", 35))

button1 = tk.Button(wn, width = 20, text = "Addition", command = lambda: placeTasks("addition"))

button2 = tk.Button(wn, width = 20, text = "Subtraction")

button3 = tk.Button(wn, width = 20, text = "Multiplication")

button4 = tk.Button(wn, width = 20, text = "Division")

placeMenu()

wn.mainloop()

TL;DR

在初始化入口时设置font,重命名if语句并删除全局变量并使用局部(oper)


我首先看到的是很多重复。创建一个包含更多参数的函数,您将在该函数上执行 for 循环 - 代码将缩短 20 倍且可读性更高。 Tkinter虽然简单,但是如果不是面向对象的话,不实用(我推荐tk.Toplevel类切换窗口,那么你只需要切换屏幕,不需要删除和设置,进一步加快执行速度).为每个算术运算创建 class 并且不使用(慢速)匿名 lambda 函数仅用于调用属性是理想的。 所以代码看起来像这样:

for (akcija, klasa) in zip(["Addition", "Substraction", ...], lista_klasi):

    button = tk.Button(wn, width=20, text=akcija, command=klasa);
    ...
    button.pack()  # Izbjegavaj .place(), uvijek samo pack() ili grid()
    ...

class Solution(tk.Toplevel):
    def __init__(self, atributi):
        super().__init__()
        self.attributes("-topmost", False)
        self.solution = tk.Canvas(self, bg="white" ...)
        self.solution.pack()
        ...
        # Za najbolji izgled postavljaj widgete na canvas...
        self.solution.create_window(w, h, window=atribut[neki])

        # Također, ako želiš ostati u istom prozoru, spremi widgete i koristi:
        self.canvas.delete("all")

我个人用pack,因为它最简单,一开始不方便,因为你得到的不是你想象的样子,但当你掌握了一切,你就再也回不去了() , 除非有必要:)


现在,首先研究所有已阐明的示例ovdje。 只有掌握了tkinter,真想在比赛中出人头地,就去kivy