Ткинтер читает строки в порядке из csv файлов - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь создать средство устранения неполадок для некоторых устройств, есть поле ввода, которое использует ваше ключевое слово, чтобы перейти к правильному фрейму, который работает нормально, но мне нужна помощь, чтобы прочитать каждый отдельный шаг из файла CSV, который имеет это конкретная проблема. Чтобы сделать это, я сделал кнопку, которая читает первый шаг в файле csv, однако я хочу сделать еще одну кнопку под названием «Следующий шаг», которая отображает следующий шаг в файле csv при каждом нажатии. Я также хотел бы знать, как я могу избавиться от кнопки «Первый шаг», чтобы не было путаницы и чтобы это имело смысл. Я попытался назначить переменную, равную True, и сделал цикл while, чтобы сделать так, чтобы кнопка отображалась только тогда, когда для переменной задано значение true, что не работало вообще. Любые идеи о том, как сделать эту работу, все очень ценится.

Вот мой код

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)


    def stepOne():
        with open("Wet Device.csv", "r") as f:
            csvreader = csv.reader(f, delimiter=",")
            for row in csvreader:
                if "1" in row[0]:
                    test = str(row[1])
                    stepOneL = tk.Label(self, text=test)
                    stepOneL.place(x = 10, y = 70, width = 500, height = 20)

    #def nextStep():



    stepOneB = tk.Button(self, text="First Step",
                         command=lambda: stepOne())
    stepOneB.place(x = 230, y = 130, 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)  

CSV-файл в этом формате (всего 5 шагов):

Step, Instructions
1, instruction
2, instruction
3, instruction
4, instruction
5, instruction

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

Любая помощь очень ценится

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Есть много проблем с вашим кодом.

Вы не можете использовать .pack() и .place() в одном кадре

В пределах __init__()из класса wetDevice иногда вы используете .pack() и .place().Поэтому все размещенные элементы не отображаются в вашем окне.

Просто измените эти элементы на .place() или .pack()

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

  1. Я изменил 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 и установит для него текст «Нет шагов».

0 голосов
/ 17 мая 2019

Вы можете добавить csvreader к объекту, получить первую строку внутри init init, добавить его в окно и ссылаться на объект каждый раз, когда вы нажимаете следующую кнопку. Затем вы можете получить доступ к элементам csv по одному, и вам не нужно, например, итерируйте по всем строкам, чтобы найти строку с row[0] = "1" и можете выбрать, где вы ее оставили.

...
self.csvreader = csv.reader(f, delimiter=",")
data = next(self.csvreader)
# set text with data
...

def nextStep():
    data = next(self.csvreader)
    # change text with data

Имейте в виду, что при исчерпании csv возникает исключение.

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