Наклейки Tkinter перекрываются - PullRequest
0 голосов
/ 22 декабря 2018

Я очень плохо знаком с python и tkinter и пытаюсь сделать действительно простой и простой калькулятор.

Этот код работает так, как я и предполагал, за исключением того, что если я хочу распечатать 2 результата безпри перезапуске программы метки перекрываются.

Вот как это выглядит, когда я печатаю 50 * 50, а затем меняю его на 50/50 без перезапуска программы.

enter image description here

from tkinter import *

w = Tk()

#****FUNCTIONS****

def multiply():

    number1 = float(e1.get())
    number2 = float(e2.get())

    result1 = number1 * number2
    resultlabel1 = Label(w, text=result1)
    resultlabel1.grid(row=2, column=0)

def division():

    number1 = float(e1.get())
    number2 = float(e2.get())
    result1 = number1 / number2
    resultlabel1 = Label(w, text=result1)
    resultlabel1.grid(row=2, column=0)

def addition():
    number1 = float(e1.get())
    number2 = float(e2.get())
    result1 = number1 + number2
    resultlabel1 = Label(w, text=result1)
    resultlabel1.grid(row=2, column=0)

def subtraction():
    number1 = float(e1.get())
    number2 = float(e2.get())
    result1 = number1 - number2
    resultlabel1 = Label(w, text=result1)
    resultlabel1.grid(row=2, column=0)





# ****LABELS, ENTRIES AND BUTTONS****

l1 = Label(w, text="First number: ")
l2 = Label(w, text="Second number: ")
e1 = Entry(w)
e2 = Entry(w)
b1 = Button(w, text="*", command=multiply)
b2 = Button(w, text="/", command=division)
b3 = Button(w, text="-", command=subtraction)
b4 = Button(w, text="+", command=addition)
b5 = Button(w, text="Exit", command=w.quit)



#****PLACEMENTS****

l1.grid(row=0, column=0)
l2.grid(row=1, column=0)

e1.grid(row=0, column=1)
e2.grid(row=1, column=1)

b1.grid(row=0, column=2)
b2.grid(row=0, column=3)
b3.grid(row=1, column=3)
b4.grid(row=1, column=2)
b5.grid(row=2, column=4)

w.mainloop()

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

В каждой из ваших функций вы создаете новый resultLabel1.Это означает, что вы создаете новую метку каждый раз, когда выполняете расчет, вместо того, чтобы перезаписывать или редактировать одну и ту же метку.

Каждый раз, когда вы создаете новую метку в каждой функции, вы создаете переменную local.Это означает, что переменная может использоваться только внутри этой функции, поэтому она не перезаписывается во всех других функциях.

Чтобы решить эту проблему, вы можете создать виджет Label со всеми остальными:

l1 = Label(w, text="First number: ")
l2 = Label(w, text="Second number: ")
e1 = Entry(w)
e2 = Entry(w)
b1 = Button(w, text="*", command=multiply)
b2 = Button(w, text="/", command=division)
b3 = Button(w, text="-", command=subtraction)
b4 = Button(w, text="+", command=addition)
b5 = Button(w, text="Exit", command=w.quit)
resultlabel1 = Label(w)  # leave the text empty when you first create it

Затем вы можете добавить его в окно со всеми другими виджетами тоже:

l1.grid(row=0, column=0)
l2.grid(row=1, column=0)

e1.grid(row=0, column=1)
e2.grid(row=1, column=1)

b1.grid(row=0, column=2)
b2.grid(row=0, column=3)
b3.grid(row=1, column=3)
b4.grid(row=1, column=2)
b5.grid(row=2, column=4)

resultlabel1.grid(row=2, column=0)

-

Создав свой ярлык снаружи функции, это означает, что она является переменной global и может использоваться везде.

Я буду использовать функцию умножения в качестве примера.Первое, что вам нужно сделать, это глобализировать resultLabel1.Это означает, что она может использоваться внутри функции как переменная global, и что функция не должна использовать свою собственную переменную local.

Теперь вместо создания нового экземпляра resultLabel1каждый раз, когда вы запускаете расчет, вы должны редактировать уже созданную вами метку.Использование global resultLabel1 позволяет нам получить доступ к переменной из этой функции.Чтобы отредактировать виджет, вы используете .config(**options), и в качестве аргументов укажите вещи, которые вы хотите изменить (подробнее см. Здесь) .Таким образом, в этом случае вы должны запустить resultLabel1.config(text=result1)

def multiply():
    global resultLabel1  # means the function can use the global variable

    number1 = float(e1.get())
    number2 = float(e2.get())
    result1 = number1 * number2

    resultlabel1.config(text=result1)  # edits the variable's text
0 голосов
/ 22 декабря 2018

определяет ваш resultlabel1 вне ваших функций, где создается остальная часть GUI.Затем вместо этого добавьте

resultlabel1.config(text=result1)

ко всем вашим функциям - даже если метка определена под ними, она будет работать, поскольку теперь она является глобальной переменной.Это вместо того, чтобы создавать новую метку каждый раз, просто изменяет отображаемый текст в одной метке, тем самым предотвращая любое перекрытие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...