Как связать функцию с кнопкой в ​​Tkinter? - PullRequest
0 голосов
/ 14 апреля 2020

Итак, я сделал код "калькулятора любви", и он работает, но я хочу дать ему GUI. Я хочу, чтобы когда я нажимал на кнопку, под ней появлялось число. но я не могу заставить его работать. Мне действительно нужна помощь. Я использую python 3.8 с Tkinter. Я хочу, когда я нажимаю на кнопку. Я получаю ошибку, что l1 не определен. Пожалуйста, помогите, потому что я абсолютный новичок в Pyhton.
Вот код:

import random
import tkinter as tk
from tkinter import *
from random import*




def get_love():
      name1 = entry1.get()
      name2 = entry2.get() 
      if (len(name1)) - (len(name2))== 2 or 1 or 0 or -1 or -2 or -3: 
         l1 = tk.Label(root, text="Here is how much you love eachother:  ", (randint(40, 100)), '%')
      else:
        l2 = tk.Label(root, "Here is how much you love eachother:  ", (randint(0, 49)), '%')






root = tk.Tk()
root.title("Love Calculator")
root.minsize(600, 600)
root.configure(background = 'pink')


w = tk.Label(root, bg="pink",font="Times 32 bold", text="Welcome to Love Calculator")
w1 = tk.Label(root, bg="pink",font="Arial 20", text=" ")


w2 = tk.Label(root, bg="pink", fg="white" ,font="Arial 19", text="Write your name here")
entry1 = tk.Entry (root)

w10 = tk.Label(root, bg="pink",font="Arial 20", text=" ")

w3 = tk.Label(root, bg="pink", fg="white" ,font="Arial 19", text="Write your lover's name here")
entry2 = tk.Entry (root)










b = Button(root, text="Click to see how much you love each other", font='Times 20 bold', command=get_love)





w.pack()
w1.pack()
w2.pack()
entry1.pack()
entry2.pack()
w3.pack()
w10.pack()
b.pack()
l1.pack()
l2.pack()


root.mainloop()

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

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


Есть три простые проблемы с вашей программой:


Задача 1:

Вы используете or в неправильный путь, поэтому условие (if) всегда возвращает True, а блок else никогда не выполняется, Здесь:

    if (len(name1)) - (len(name2)) == 2 or 1 or 0 or -1 or -2 or -3:

Решение:

Вы можете использовать range, чтобы решить эту проблему. Вы должны дать ему два числа, помня, что второе число не будет включено в диапазон, например:

    if (len(name1)) - (len(name2)) in range(-3, 3):

Задача 2:

Вы делаете ошибку в конкатенации строк, Здесь:

    text="Here is how much you love each other:  ", (randint(40, 100)), '%')

Решение:

Есть два возможно решения для этой задачи:

  1. Вы можете использовать символ плюс "+" вместо запятых в нем, например:
    text="Here is how much you love each other: " + str(randint(40, 100)) + '%'

Но как вы можете видеть, тогда вам также нужно будет преобразовать случайное целое число (randint(40, 100)) в строку, например: str(randint(40, 100))

Самым простым решением этой проблемы является использование отформатированной строки, например:
    text=f"Here is how much you love each other: {(randint(40, 100))}%"

Задача 3:

Основная причина для получения ошибки заключается в том, что вы определили свои метки (l1 и l2) внутри функции (get_love()), и вы пытаетесь pack() эти метки вне функции .

Решение:

Решение состоит в том, чтобы удалить pack() извне функции для обеих меток (l1 и l2) и pack() их внутри функции сразу после их определения. Как это:

def get_love():

    name1 = entry1.get()
    name2 = entry2.get()

    if (len(name1)) - (len(name2)) == 2 or 1 or 0 or -1 or -2 or -3:
        l1 = tk.Label(root, text=f"Here is how much you love each other: {(randint(40, 100))}%")
        l1.pack()

    else:
        l2 = tk.Label(root, text=f"Here is how much you love each other: {(randint(0, 49))}%")
        l2.pack()


Полный фиксированный код:

Вот полный фиксированный код для вас:

import tkinter as tk
from random import *


def get_love():

    name1 = entry1.get()
    name2 = entry2.get()

    if (len(name1)) - (len(name2)) in range(-3, 3):
        l1 = tk.Label(root, text=f"Here is how much you love each other: {(randint(40, 100))}%")
        l1.pack()

    else:
        l2 = tk.Label(root, text=f"Here is how much you love each other: {(randint(0, 49))}%")
        l2.pack()


root = tk.Tk()
root.title("Love Calculator")
root.minsize(600, 600)
root.configure(background='pink')


w = tk.Label(root, bg="pink", font="Times 32 bold", text="Welcome to Love Calculator")
w1 = tk.Label(root, bg="pink", font="Arial 20", text=" ")


w2 = tk.Label(root, bg="pink", fg="white", font="Arial 19", text="Write your name here")
entry1 = tk.Entry(root)

w10 = tk.Label(root, bg="pink", font="Arial 20", text=" ")

w3 = tk.Label(root, bg="pink", fg="white", font="Arial 19", text="Write your lover's name here")
entry2 = tk.Entry(root)


b = tk.Button(root, text="Click to see how much you love each other", font='Times 20 bold', command=get_love)


w.pack()
w1.pack()
w2.pack()
entry1.pack()
entry2.pack()
w3.pack()
w10.pack()
b.pack()


root.mainloop()

0 голосов
/ 14 апреля 2020

Я не думаю, что здесь нужна лямбда, просто используйте if/else, чтобы сгенерировать число, затем отформатируйте его в текст метки.

Python имеет хорошую функцию для проверки, если число находится между двумя значениями: if -3 <= x <= 2

Кроме того, избегайте ловушек, таких как использование чисел в качестве переменных и многократный импорт (импорт tkinter as tk, из tkinter import *)

Для меток, которые никогда не меняя, вам не нужно хранить их в переменной, просто упакуйте / поместите / поместите их как есть.

Если вам просто нужен пробел в окне, добавьте отступ к существующему виджету или используйте макет сетки.

Это всего лишь предложения, которые, надеюсь, помогут.

I сделал кучу очистки кода здесь:

from random import randint
import tkinter as tk

def get_love():
    name1 = entry1.get()
    name2 = entry2.get() 
    if -3 <= (len(name1) - len(name2)) <= 2:
        number = randint(40, 100)
    else:
        number = randint(0, 49)
    display.config(text="Here is how much you love eachother: {}%".format(number))

root = tk.Tk()
root.title("Love Calculator")
root.minsize(600, 600)
root.configure(background = 'pink')

tk.Label(root, bg="pink",font="Times 32 bold",
         text="Welcome to Love Calculator").pack(pady = (0, 20))

tk.Label(root, bg="pink", fg="white", font="Arial 19",
         text="Write your name here").pack()

entry1 = tk.Entry(root)
entry1.pack()

entry2 = tk.Entry(root)
entry2.pack()

tk.Label(root, bg="pink", fg="white",font="Arial 19",
         text="Write your lover's name here").pack(pady = (0, 20))

tk.Button(root, text="Click to see how much you love each other",
          font='Times 20 bold', command=get_love).pack(pady = (0, 20))

display = tk.Label(root, bg="pink")
display.pack()

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