Python функция отсутствует позиционные аргументы - PullRequest
0 голосов
/ 05 марта 2020

Я использую Tkinter в python. Я создал холст и пытаюсь переместить виджет с его позиции.
Но сейчас я получаю эту ошибку:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Udasi\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Users\Udasi\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 749, in callit
    func(*args)
TypeError: move_up() missing 6 required positional arguments: 'tag', 'parent', 'root', 'pady_top', 'x', and 'y'

Вот код:

import tkinter

def move_up(tag, parent, root, pady_top, x, y):
    y-=10
    parent.move(tag, 0, -10)
    if(y>pady_top):
        root.after(100, move_up)
    else:
        parent.move(tag, 0, y-pady_top)
    return y


def float_top(tag, widget, parent, root, pady_top, x, y):
    move_up(tag, parent, root, pady_top, x, y)

Я не понимаю, где проблема. Вот код в отдельном файле, который его вызывает:

import tkinter as tk
from PIL import Image, ImageTk
import animations

class App():
    def __init__(self, colors, logo_loc):
        self.colors = colors
        self.root = tk.Tk()
        self.root.state("zoomed")
        self.rootFrame = tk.Canvas(self.root, width=self.root.winfo_width(), height=self.root.winfo_height())
        self.rootFrame.pack(fill=tk.BOTH, expand=True)
        self.logo_loc=logo_loc

    def firstScreen(self):
        self.rootFrame.config(background=self.colors['primary'])
        x = (self.root.winfo_width()//2)    
        y = (self.root.winfo_height()//2)
        self.logo_tag="logo"
        self.logo_id=self.rootFrame.create_image(x+10, y, image=self.logo, tags="logo")
        animations.float_top(self.logo_tag, self.logo, self.rootFrame, self.root, 100, x, y)

    def loadLogo(self):
        self.logo = ImageTk.PhotoImage(file=self.logo_loc)
        self.root.update()


class Controller:
    def __init__(self, app):
        self.app = app
        self.app.loadLogo()
        self.app.firstScreen()


colors = {'primary':"#1e1e1e", 'secondary':"#001ec8", 'tertiary':"#e6a00a", 'common':"#f0f0f0"}


app = App(colors, "assets/musik.PNG")
controller = Controller(app)
app.root.mainloop()

В частности, это здесь:

animations.float_top(self.logo_tag, self.logo, self.rootFrame, self.root, 100, x, y)

Я также попытался передать 5 аргументов, затем он вызвал ту же ошибку, говоря 1 позиционный аргумент отсутствует ... но когда я передаю их все, он говорит, что все аргументы отсутствуют!

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Ошибка в том, что я вызываю move_up в root .after (100, move_up) ... Мне нужно передать туда аргументы!

root.after(100, move_up)

Вместо этого должно быть

root.after(100, move_up, tag, parent, root, pady_top, x, y)
0 голосов
/ 05 марта 2020

Я скопировал ваш код и запустил на macOS с python 3.7. Там нет ошибки, но также не отображается окно. Согласно информации об ошибке, исключением является отчет в tkinter. В частности, ошибка сообщается в классе CallWrapper, код которого

class CallWrapper:
    # ...
    def __call__(self, *args):
        """Apply first function SUBST to arguments, than FUNC."""
        try:
            if self.subst:
                args = self.subst(*args)
            return self.func(*args)
        except SystemExit:
            raise
        except:
            self.widget._report_exception()

Обратите внимание, что поднимается только SystemExit. Другие исключения, такие как TypeError, обрабатываются внутри, и печатается только часть информации об ошибке. Чтобы проверить полный стек ошибок, в соответствии с этим ответом вы можете переопределить CallWrapper, используя:

class TkErrorCatcher:

    '''
    In some cases tkinter will only print the traceback.
    Enables the program to catch tkinter errors normally

    To use
    import tkinter
    tkinter.CallWrapper = TkErrorCatcher
    '''

    def __init__(self, func, subst, widget):
        self.func = func
        self.subst = subst
        self.widget = widget

    def __call__(self, *args):
        try:
            if self.subst:
                args = self.subst(*args)
            return self.func(*args)
        except SystemExit as msg:
            raise SystemExit(msg)
        except Exception as err:
            raise err

import tkinter
tkinter.CallWrapper = TkErrorCatcher

, что вызовет все ошибки. Попробуйте приведенный выше код и просмотрите полный стек ошибок.

...