Вызов функции кнопки из другого класса в tkinter - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу создать кнопку, которая использует функцию (SaveFile) из другого класса, но она выдает TypeError.

"TypeError: SaveFile() missing 1 required positional argument: 'self'"

Мой код:

import tkinter as tk

class App1(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        tk.Button(self, text="Browse", command=self.SaveFile).grid(row=4, column=4)
        self.t1 = tk.Text(self, height=1, width=40, font="Times 9")
        self.t1.grid(row=2, column=3)

    def SaveFile(self):
        global name2
        name2 = asksaveasfilename(initialdir="\\", filetypes=(("Html Files", "*.html"),("All Files","*.*")),
                                  title = "Output path.")
        self.t1.delete("1.0", tk.END)
        self.t1.insert(tk.END, name2)

class App2(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent) 
        self.b1 = tk.Button(self, text="Browse", command=App1.SaveFile)
        self.b1.grid(row=2, column=4)

1 Ответ

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

хорошо для более конкретного примера:

import tkinter as tk

class App1(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        tk.Button(self, text="Browse", command=self.SaveFile).grid(row=4, column=4)
        self.t1 = tk.Text(self, height=1, width=40, font="Times 9")
        self.t1.grid(row=2, column=3)

    def SaveFile(self):
        global name2
        name2 = asksaveasfilename(initialdir="\\", filetypes=(("Html Files", "*.html"),("All Files","*.*")),
                                  title = "Output path.")
        self.t1.delete("1.0", tk.END)
        self.t1.insert(tk.END, name2)

class App2(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent) 
        self.b1 = tk.Button(self, text="Browse", command=App1.SaveFile)
        self.b1.grid(row=2, column=4)

app1_inst = App1(parent, controller) # this creates an instance
app2_inst = App2(parent, controller) # this also creates an instance

App1.SaveFile # this is being called a class method, it is attached to the class so self does not get passed
app1_inst.SaveFile # is being called as an instance method where self = app1_inst

, поскольку app2_inst не имеет ссылки на app1_inst, он не может вызвать его как метод экземпляра.вызов App1.SaveFile не передает экземпляр, потому что он не знает, есть ли экземпляр.

вам нужно изменить определение App2, чтобы иметь возможность передавать (и, возможно, сохранять ссылку на)экземпляр App1.

, например, импорт tkinter as tk

class App1(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        tk.Button(self, text="Browse", command=self.SaveFile).grid(row=4, column=4)
        self.t1 = tk.Text(self, height=1, width=40, font="Times 9")
        self.t1.grid(row=2, column=3)

    def SaveFile(self):
        global name2
        name2 = asksaveasfilename(initialdir="\\", filetypes=(("Html Files", "*.html"),("All Files","*.*")),
                                  title = "Output path.")
        self.t1.delete("1.0", tk.END)
        self.t1.insert(tk.END, name2)

class App2(tk.Frame):

    def __init__(self, parent, controller, app1):
        tk.Frame.__init__(self, parent) 
        self.app1 = app1
        self.b1 = tk.Button(self, text="Browse", command=self.app1.SaveFile)
        self.b1.grid(row=2, column=4)

app1_inst = App1(parent, controller)
app2_inst = App2(parent, controller, app1_inst)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...