"TypeError: Start () отсутствует 1 обязательный позиционный аргумент: 'self'" - PullRequest
0 голосов
/ 28 сентября 2018

Я не понимаю, что означает "TypeError: Start () отсутствует 1 обязательный позиционный аргумент: 'self'".Мне необходимо уточнить, к чему относится это сообщение об ошибке и что требуется для его исправления.

В то время как этот другой вопрос переполнения стека отвечает на вопрос о «необходимости создания экземпляра объекта Application и вызова start для этого, а не для класса», я абсолютно не понимаю, что подразумевается под этим объяснениемкак можно проще языка.Какой вид исправления кода особенно необходим для исправления ошибок такого рода?

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

Exception in Tkinter callback Traceback (most recent call last): File "C:\Program Files (x86)\Python36-32\lib\tkinter\__init__.py", line 1699, in __call__ return self.func(*args) TypeError: Start() missing 1 required positional argument: 'self' Exception in Tkinter callback Traceback (most recent call last): File "C:\Program Files (x86)\Python36-32\lib\tkinter\__init__.py", line 1699, in __call__ return self.func(*args) TypeError: Start() missing 1 required positional argument: 'self'

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

import tkinter as tk
from tkinter import PhotoImage
import time

class TimeCheck():
    def __init__(self, parent=None, **kw):        
        self._start = 0.0        
        self._elapsedtime = 0.0
        self._running = 0              

    def trianglemove(move_x, move_y):
        canvas.move (triangle3, move_x, move_y)

    def _update(self):
        self._elapsedtime = time.time() - self._start
        self._setTime(self._elapsedtime)
        self._timer = self.after(50, self._update)

    def _setTime(self, elap):
        """ Set the time string to Minutes:Seconds:Hundreths """
        minutes = int(elap/60)
        seconds = int(elap - minutes*60.0)
        hseconds = int((elap - minutes*60.0 - seconds)*100)                  

    def Start(self):                                                     
        """ Start the stopwatch, ignore if running. """
        if not self._running:            
            self._start = time.time() - self._elapsedtime
            self._update()
            self._running = 1
            print ("RECORD")
            #for recordcounter in range(768):
            trianglemove(1, 0)

    def Stop(self):                                    
        """ Stop the stopwatch, ignore if stopped. """
        if self._running:
            self.after_cancel(self._timer)            
            self._elapsedtime = time.time() - self._start    
            self._setTime(self._elapsedtime)
            self._running = 0

    def Reset(self):                                  
        """ Reset the stopwatch. """
        self._start = time.time()         
        self._elapsedtime = 0.0    
        self._setTime(self._elapsedtime)    

root = tk.Tk()
root.geometry("960x600")

timechecker = TimeCheck(root)

recordbutton = PhotoImage(file="images/recordbutton.gif")
beatbutton = PhotoImage(file="images/beatbutton.gif")
stopbutton = PhotoImage(file="images/stopbutton.gif")

label_toptitle = tk.Label(root, text="Program Name", font=(None, 40),)
label_toptitle.grid(row=0, columnspan=3)

description = "To create rhythm, press the red record button. While recording, use the clicked note button to\n create a series of rectangle notes on screen. They can be held to extend the rectangles. \n\n Once you are done, press the red stop button to stop recording"

pixel = PhotoImage(width=1, height=1)
label_desc = tk.Label(root, image=pixel, compound="center", width=900, font=(None, 14),
                                          padx=20, pady=10, text=description)

label_desc.grid(row=1, columnspan=3)

canvas = tk.Canvas(width=960, height=300, bg='white')
canvas.grid(row=2, column=0, columnspan=3)

for linecounter in range(49):
        newtextbit = linecounter + 1
        if (newtextbit + 3) % 4 == 0 and newtextbit != 49:
                #print ('x is divisible by 3')
                canvas.create_text((linecounter * 16 + 80), 90,
                                           fill="darkblue",
                                           font="Times 10 bold",
                                           text=newtextbit)
        if (newtextbit + 3) % 4 == 0:
                canvas.create_line(((linecounter * 16 + 80)), 40, ((linecounter * 16 + 80)), 70,
                                           width=1,
                                           fill="black"
                                           )
        else:
                canvas.create_line(((linecounter * 16 + 80)), 50, ((linecounter * 16 + 80)), 70,
                                           width=1,
                                           fill="black"
                                           )
canvas.create_line(73, 70, 860, 70,
                                   width=2,
                                   fill="black"
                                   )
triangle3 = canvas.create_polygon(75, 25, 86, 25, 80, 40, fill ='red')

f1 = tk.Frame(root, width=70, height=30)
f1.grid(row=3, column=0, sticky='W')

button_record = tk.Button(f1,
                                                text="Record",
                                                image=recordbutton,
                                                command=TimeCheck.Start,
                                                compound="top"
                                                )
button_beat = tk.Button(f1,
                                                text="Beat",
                                                image=beatbutton,
                                                #command=tomato,
                                                compound="top"
                                                )
button_playstop = tk.Button(f1,
                                                text="Stop",
                                                image=stopbutton,
                                                #command=potato,
                                                compound="top"
                                                )

button_record.pack(side='left', padx=140)
button_beat.pack(side='left', padx=55)
button_playstop.pack(side='left', padx=140)

root.mainloop()

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

1 Ответ

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

Причина, по которой он сообщает вам об ошибке, произошедшей в строке 1699, заключается в том, что ошибка произошла, когда Tkinter пытается вызвать вашу функцию, указанную в аргументе command=TimeCheck.Start.Таким образом, ошибка происходит внутри кода модуля Tkinter, но вызвана тем, как вы передали аргументы.

Вам необходимо создать экземпляр класса TimeCheck перед вызовом внутри него нестатических методов.В сообщении сообщается, что ожидаемый параметр self для функции Start не был передан, что происходит за кулисами в Python при вызове функции для экземпляра объекта.

Все, что вам нужно сделатьсделать так, чтобы ваш параметр команды кнопки был таким:

button_record = tk.Button(f1,
                          text="Record",
                          image=recordbutton,
                          command=timechecker.Start,
                          compound="top")

Где timechecker - это уже созданный экземпляр объекта TimeCheck, из которого вызывается функция Start.

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