Функции не работают в Python Tkinter? - PullRequest
3 голосов
/ 20 февраля 2020

У меня есть программа в Python Tkinter, в которой я сделал три строки по 10 ярлыков и кнопку «Пуск» под ними. Я использовал циклы для отображения текста в метках.

Только в первой строке меток Отображаются заголовки.

Labels Headings

Вторую строку метки Я установил условие, что если модуль значения цикла равен нулю (a%2==0), то он отображает текст метки ON, иначе OFF, и это условие противоположно в третьей строке метки, как показано ниже и в коде.

enter image description here

Наконец, для кнопки «Пуск» я вызвал функцию, которая распознает процесс, который, если модуль 2 значения переменной цикла равен единице, отображает текст меток OFF во второй строке меток else ON. Этот процесс противоположен третьему ряду ярлыков. Но проблема здесь в том, что когда я нажимаю кнопку «Пуск», она меняет только последнее значение второй и третьей строки меток, но я хочу изменить все из них. Я думаю, что функции не работают должным образом, как хотелось бы. Код ниже.

from tkinter import *
import tkinter as tk

win = Tk()
win.title("Label")
win.geometry("800x600+50+50")
win.config(bg='white')

label1=Label(win, text="Label Status Changer", font=("Calibri",24,"bold"), bg='white', borderwidth=1, relief="solid", padx=20, pady=20) #"flat", "raised", "sunken", "ridge", "solid", and "groove"
label1.pack(pady=(15,60))


lblframe = tk.Frame(win)
for a1 in range(10):
    pre1=Label(lblframe, text=("LBL",(a1+1)), font=("Calibri",12, "bold"), bg="white", borderwidth=1, relief="solid", padx=5, pady=2)
    pre1.grid(row=0, column=a1)

for a2 in range(10):
    if ( a2%2 == 0 ):
        pre2=Label(lblframe, text="OFF", font=("Calibri",12,"bold"), bg="white", fg="Green", borderwidth=1, relief="solid", padx=11, pady=1)
        pre2.grid(row=1, column=a2, sticky="nw")
    else:
        pre2=Label(lblframe, text="ON", font=("Calibri",12,"bold"), bg="white", fg="Red", borderwidth=1, relief="solid", padx=11, pady=1)
        pre2.grid(row=1, column=a2, sticky="nw")

for a3 in range(10):
    if (a3%2 == 1):
        pre3=Label(lblframe, text="OFF", font=("Calibri",12,"bold"), bg="white", fg="Green", borderwidth=1, relief="solid", padx=11, pady=1)
        pre3.grid(row=2, column=a3, sticky="nw")
    else:
        pre3=Label(lblframe, text="ON", font=("Calibri",12,"bold"), bg="white", fg="Red", borderwidth=1, relief="solid", padx=11, pady=1)
        pre3.grid(row=2, column=a3, sticky="nw")

lblframe.pack()

def oldstatus():
    for a4 in range(10):
        if(a4%2==1):
            pre2.config(text="OFF")
        else:
            pre2.config(text="ON")

def newstatus():
    for a5 in range(10):
        if(a5%2==0):
            pre3.config(text="OFF")
        else:
            pre3.config(text="ON")

def statuschanger():
    oldstatus()
    newstatus()

#Button1
button1=Button(win,text="Start",width=10,height=2, font=("Calibri",16,"bold"), bg="black",fg="white", command=statuschanger)
button1.pack(pady=(30,0))

win.mainloop()

Выход при работающей программе

enter image description here

Выход при нажатии Кнопка запуска

enter image description here

Ответы [ 2 ]

3 голосов
/ 20 февраля 2020

Работает:

from tkinter import *
import tkinter as tk

win = Tk()
win.title("Label")
win.geometry("800x600+50+50")
win.config(bg='white')

label1=Label(win, text="Label Status Changer", font=("Calibri",24,"bold"), bg='white', borderwidth=1, relief="solid", padx=20, pady=20) #"flat", "raised", "sunken", "ridge", "solid", and "groove"
label1.pack(pady=(15,60))

list1=[]
list2=[]

lblframe = tk.Frame(win)
for a1 in range(10):
    pre1=Label(lblframe, text=("LBL",(a1+1)), font=("Calibri",12, "bold"), bg="white", borderwidth=1, relief="solid", padx=5, pady=2)
    pre1.grid(row=0, column=a1)

for l1 in range(10):
    if l1%2 ==0:
        list1.append(1)
    else:
        list1.append(0)

print(list1)
for l2 in range(10):
    if l2%2 ==1:
        list2.append(1)
    else:
        list2.append(0)
print(list2)

def mylabels():
    for a2 in range(10):
        if ( int(list1[a2])== 0 ):
            pre2=Label(lblframe, text="OFF", font=("Calibri",12,"bold"), bg="white", fg="Green", borderwidth=1, relief="solid", padx=11, pady=1)
            pre2.grid(row=1, column=a2, sticky="nw")
            #list1.append(pre2.cget("text"))
        else:
            pre2=Label(lblframe, text="ON", font=("Calibri",12,"bold"), bg="white", fg="Red", borderwidth=1, relief="solid", padx=11, pady=1)
            pre2.grid(row=1, column=a2, sticky="nw")
            #list1.append(pre2.cget("text"))

    for a3 in range(10):
        if (int(list2[a3])== 0):
            pre3=Label(lblframe, text="OFF", font=("Calibri",12,"bold"), bg="white", fg="Green", borderwidth=1, relief="solid", padx=11, pady=1)
            pre3.grid(row=2, column=a3, sticky="nw")
            #list2.append(pre3.cget("text"))
        else:
            pre3=Label(lblframe, text="ON", font=("Calibri",12,"bold"), bg="white", fg="Red", borderwidth=1, relief="solid", padx=11, pady=1)
            pre3.grid(row=2, column=a3, sticky="nw")
            #list2.append(pre3.cget("text"))

lblframe.pack()

mylabels()

def statuschanger():
    list1.clear()
    list2.clear()
    for l3 in range(10):
        if l3%2 ==1:
            list1.append(1)
        else:
            list1.append(0)

    for l4 in range(10):
        if l4%2 ==0:
            list2.append(1)
        else:
            list2.append(0)
    mylabels()


#Button1
button1=Button(win,text="Start",width=10,height=2, font=("Calibri",16,"bold"), bg="black",fg="white", command=statuschanger)
button1.pack(pady=(30,0))

win.mainloop()

Вывод при текущем программировании

enter image description here

Выход при нажатии кнопки запуска

enter image description here

0 голосов
/ 20 февраля 2020

Например,

pre2.config(text="OFF")

Здесь pre2 относится к одной из кнопок - последней, созданной в l oop. Таким образом, он может только изменить эту кнопку. Вам необходимо иметь доступ к каждой кнопке в строке, например, сохраняя их в списке.

Кроме того, вызов oldstatus, а затем newstatus немедленно будет означать, что эффект oldstatus не видно, так как изменения заменены сразу. Попытайтесь вспомнить, каково текущее состояние кнопок (поскольку вы переключаетесь между двумя состояниями, вам нужно только логическое значение), и используйте его, чтобы решить, какие изменения внести. (Не забудьте обновить значение статуса после внесения изменений!)

...