Есть много проблем с вашим кодом.
Вы не можете использовать .pack()
и .place()
в одном кадре
В пределах __init__()
из класса wetDevice
иногда вы используете .pack()
и .place()
.Поэтому все размещенные элементы не отображаются в вашем окне.
Просто измените эти элементы на .place()
или .pack()
Я внес коррективы в ваш код, чтобы онбудет работать так, как я полагаю, вы хотите.
- Я изменил
stepOne()
на просто step()
, так как для написания кода вам понадобится только один этот методпереход к следующему шагу
def step():
row = next(self.csvreader)
test = str(row[1])
self.instruction.configure(text=test)
stepOneB.configure(text="Next Step")
Я изменил способ работы вашего wetDevice, теперь у него есть переменная
self.instruction
, которая является элементом
tk.Label
, именно здесь отображается текущая инструкция.Я также добавил
self.csvreader
это удерживать CSV, на текущем шаге вы находитесь.
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text="How to fix a wet phone", fg="purple")
label.pack(side="top", fill="x", pady=10)
self.instruction = tk.Label(self, text="", fg="purple") # the new instruction Label
self.instruction.pack()
f = open("Wet Device.csv", "r")
self.csvreader = csv.reader(f, delimiter=",") # new csv element
Вот полный рабочий код, который, я считаю, будет работать как выхочу.
import tkinter as tk
import csv
class wetDevice(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
label = tk.Label(self, text="How to fix a wet phone", fg="purple", font=controller.title_fontT)
label.pack(side="top", fill="x", pady=10)
self.instructions_frame = tk.Frame(self)
self.instructions_frame.place(x = 230, y = 55)
self.instruction_labels = []
f = open("Wet Device.csv", "r")
self.csvreader = csv.reader(f, delimiter=",")
def step():
try:
row = next(self.csvreader)
test = str(row[1])
if len(self.instruction_labels) >= 5:
temp = self.instruction_labels.pop(0)
temp.destroy()
instruction_temp = tk.Label(self.instructions_frame, text=test, fg="black")
instruction_temp.pack()
self.instruction_labels.append(instruction_temp)
stepOneB.configure(text="Next Step")
except StopIteration:
stepOneB.configure(state="disabled", text="No Steps")
# def nextStep():
stepOneB = tk.Button(self, text="First Step", fg="green",
command=lambda: step())
stepOneB.place(x=230, y=175, width=60, height=20)
mButton = tk.Button(self, text="Go to the Main Troubleshoot Menu",
command=lambda: controller.show_frame("MainTMenu"))
mButton.place(x=285, y=210, width=200, height=25)
Я внес изменения в код, чтобы он работал так, как вы хотели (я думаю).
Однако я сделал несколько собственных предположений.
- Я сделал так, чтобы отображались только последние 5 инструкций
И, к сожалению, так как я сделал это быстроЯ не полностью исправил тот факт, что вы получаете ошибку, однако я сделал "хакерское" исправление на данный момент.Исправление, которое я сделал, состояло в том, что если он пытается получить следующую строку csv и вызывает ошибку, он отключит nextStep
Button
и установит для него текст «Нет шагов».