Как отличить метки при их настройке в tkinter? - PullRequest
0 голосов
/ 11 сентября 2018

Обычно я пытаюсь составить список переменных, которые обновляются каждую секунду, но я могу получить только последний ярлык для обновления.Я не слишком знаком с Tkinter и ничего не помогало мне.Я думаю, что главная проблема заключается в том, что я получил его по определению, но я не знаю другого способа, если кто-то может помочь мне решить мою проблему или даже помочь пересмотреть программу, это было бы очень признательно.

import time
import textwrap
from tkinter import Tk, Label, Button
from pathlib import Path

while True:
    print(textwrap.fill("Please enter the name that you entered for the main document. It must have the exact same characters and is case sensitive.", 70))
    Name = input()
    FileName = Name+".txt"
    P = Path(FileName)

    if P.exists():

        class MyFirstGUI:

            def __init__(self, master):

                with open(FileName, "r") as file:
                    global Points
                    global Item1
                    global Item2
                    global Item3
                    global PPC
                    global PPS
                    global Item1Cost
                    global Item2Cost
                    global Item3Cost
                    read = file.read().splitlines()
                    Points = read[0]
                    Item1 = read[1]
                    Item2 = read[2]
                    Item3 = read[3]
                    PPC = 1 + int(Item3)
                    PPS = int(Item1)*1 + int(Item2)*5
                    Item1Cost = read[6]
                    Item2Cost = read[7]
                    Item3Cost = read[8]
                    Points = int(Points) + int(PPS)

                VarList = [str(Points), str(Item1), str(Item2), str(Item3), str(PPC), str(PPS), str(Item1Cost), str(Item2Cost), str(Item3Cost)]

                with open(FileName, "w") as file:

                    for List in VarList:
                        file.write(List+'\n')

                root = Tk()
                self.master = master
                master.title("Menu")

                self.label = Label(master, text=Points, anchor='w')
                self.label.pack(fill='both', padx=10)
                self.label = Label(master, text=Item1, anchor='w')
                self.label.pack(fill='both', padx=10)
                self.label = Label(master, text=Item2, anchor='w')
                self.label.pack(fill='both', padx=10)
                self.label = Label(master, text=Item3, anchor='w')
                self.label.pack(fill='both', padx=10)
                self.label = Label(master, text=Item1Cost, anchor='w')
                self.label.pack(fill='both', padx=10)
                self.label = Label(master, text=Item2Cost, anchor='w')
                self.label.pack(fill='both', padx=10)
                self.label = Label(master, text=Item3Cost, anchor='w')
                self.label.pack(fill='both', padx=10)
                self.label = Label(master, text=PPC, anchor='w')
                self.label.pack(fill='both', padx=10)
                self.label = Label(master, text=PPS, anchor='w')
                self.label.pack(fill='both', padx=10)

                root.after(1000, self.task)

            def task(self):

                with open(FileName, "r") as file:
                    global Points
                    global Item1
                    global Item2
                    global Item3
                    global PPC
                    global PPS
                    global Item1Cost
                    global Item2Cost
                    global Item3Cost
                    read = file.read().splitlines()
                    Points = read[0]
                    Item1 = read[1]
                    Item2 = read[2]
                    Item3 = read[3]
                    PPC = 1 + int(Item3)
                    PPS = int(Item1)*1 + int(Item2)*5
                    Item1Cost = read[6]
                    Item2Cost = read[7]
                    Item3Cost = read[8]
                    Points = int(Points) + int(PPS)

                VarList = [str(Points), str(Item1), str(Item2), str(Item3), str(PPC), str(PPS), str(Item1Cost), str(Item2Cost), str(Item3Cost)]

                with open(FileName, "w") as file:

                    for List in VarList:
                        file.write(List+'\n')

                self.label.configure(text=Points)
                self.label.configure(text=Item1)
                self.label.configure(text=Item2)
                self.label.configure(text=Item3)
                root.after(1000, self.task)

        root = Tk()
        my_gui = MyFirstGUI(root)
        root.mainloop()

    else:
        print(textwrap.fill("You didn't enter a valid name, please try again.", 70))

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

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

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

import textwrap
import tkinter as tk
from pathlib import Path

print(textwrap.fill("Please enter the name that you entered for the main document. It must have the exact same characters and is case sensitive.", 70))
Name = input()
file_name = "./{}.txt".format(Name)

if Path(file_name).exists() == True:

    class MyFirstGUI(tk.Tk):
        def __init__(self, fn):
            tk.Tk.__init__(self)
            self.title("Menu")
            self.file_name = fn
            self.var_list = []
            self.lbl_list = []

            with open(self.file_name, "r") as file:
                read = file.read().splitlines()
                self.var_list = [read[0], read[1], read[2], read[3], 1 + int(read[3]),
                                int(read[1])*1 + int(read[2])*5, read[6], read[7], read[8]]

            with open(self.file_name, "w") as file:
                for lst in self.var_list:
                    file.write("{}\n".format(lst))

            for i in range(9):
                self.lbl_list.append(tk.Label(self, text=self.var_list[i], anchor="w"))
                self.lbl_list[i].pack(fill='both', padx=10)

            self.task()

        def task(self):
            with open(self.file_name, "r") as file:
                read = file.read().splitlines()
                self.var_list = [read[0], read[1], read[2], read[3], 1 + int(read[3]),
                                int(read[1])*1 + int(read[2])*5, read[6], read[7], read[8]]

            self.var_list[0] = int(self.var_list[0]) + 1 # added this to visuallize some active change.

            with open(self.file_name, "w") as file:
                for lst in self.var_list:
                    file.write("{}\n".format(lst))

            for i in range(9):
                self.lbl_list[i].config(text=self.var_list[i])

            self.after(1000, self.task)


    app = MyFirstGUI(file_name)
    app.mainloop()

else:
    print(textwrap.fill("You didn't enter a valid name, please try again.", 70))
0 голосов
/ 11 сентября 2018

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

self.labels = {} #Creates an empty dictionary
self.labels["points"] = Label(master, text=Points, anchor='w')
self.labels["points"].pack.pack(fill='both', padx=10)
self.labels["Item1"] = Label(master, text=Item1, anchor='w')
self.labels["Item1"].pack(fill='both', padx=10)
#.... rest of labels here

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

self.labels = []
self.labels.append(Label(master, text=Points, anchor='w'))
self.labels.append(Label(master, text=Item1, anchor='w'))
self.labels.append(Label(master, text=Item2, anchor='w'))
#.... rest of labels here

for label in self.labels:
    label.pack(fill='both', padx=10)

Наконец, вы можете просто дать своим этикеткам разные имена.Это может быть самый ясный и прямой вариант:

self.points_label = Label(master, text=Points, anchor='w')
self.Item1_label = Label(master, text=Item1, anchor='w')
self.Item2_label = Label(master, text=Item2, anchor='w')
self.Item3_label = Label(master, text=Item3, anchor='w')
self.Item1Cost_label = Label(master, text=Item1Cost, anchor='w')
#.... rest of labels here. Don't forget to pack each one

Помните: имена идентификаторов могут быть любыми (они не должны быть просто self.label с tkinter),до тех пор, пока они:

  • Не начинайте с цифры
  • Содержат только буквы, цифры и _ *
  • Не являются зарезервированными Pythonключевые слова / функции (не рекомендуется переопределять функции, хотя это возможно.)
...