Экземпляр Python AttributeError не имеет атрибута - PullRequest
0 голосов
/ 25 мая 2018

Я получаю следующую ошибку: -

AttributeError: PageOne instance has no attribute 'scann'

Я пытаюсь запустить скрипт bash (runfocus).Все еще не могу понять, почему я получаю эту ошибку.Мой код выглядит следующим образом: -

class PageOne(tk.Frame):

    def __init__(self, parent, controller):

        running = False  # Global flag

        tk.Frame.__init__(self, parent)
        self.controller = controller

        button = tk.Button(self, text="Go to the start page",
                           command=lambda: controller.show_frame("StartPage"))
        strt = tk.Button(self, text="Start Scan", command=self.start)
        stp = tk.Button(self, text="Stop", command=self.stop)

        button.pack()       
        strt.pack()
        stp.pack()
        self.after(1000, self.scann)  # After 1 second, call scanning

    def scann(self):
        if running:
          sub.call(['./runfocus'], shell=True)

        self.after(1000, self.scann)

    def start(self):
        """Enable scanning by setting the global flag to True."""
        global running
        running = True

    def stop(self):
        """Stop scanning by setting the global flag to False."""
        global running
        running = False

Пожалуйста, предоставьте ваши ценные предложения.

1 Ответ

0 голосов
/ 25 мая 2018

Я не могу воспроизвести AttributeError: PageOne instance has no attribute 'scann' error, но у вашего скрипта есть другие проблемы, связанные с этим флагом running.Вам следует избегать использования изменяемых глобальных переменных, и когда у вас уже есть класс, совершенно не нужно использовать отдельный глобальный.Просто создайте атрибут как флаг.

Вот исправная исправленная версия вашего кода.Я заменил вызов sub.call(['./runfocus'], shell=True) простым вызовом print, чтобы мы могли видеть, что start и stop ведут себя правильно.

import tkinter as tk

class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        self.running = False

        tk.Frame.__init__(self, parent)
        self.controller = controller

        button = tk.Button(self, text="Go to the start page",
                           command=lambda: controller.show_frame("StartPage"))
        strt = tk.Button(self, text="Start Scan", command=self.start)
        stp = tk.Button(self, text="Stop", command=self.stop)

        button.pack()
        strt.pack()
        stp.pack()
        self.after(1000, self.scann)  # After 1 second, call scanning

    def scann(self):
        if self.running:
            #sub.call(['./runfocus'], shell=True)
            print("calling runfocus")

        self.after(1000, self.scann)

    def start(self):
        """Enable scanning by setting the flag to True."""
        self.running = True

    def stop(self):
        """Stop scanning by setting the flag to False."""
        self.running = False


root = tk.Tk()
frame = PageOne(root, root)
frame.pack()
root.mainloop()
...