Я делаю свой собственный модуль Python под названием zoro, и я хочу, чтобы люди могли создавать переменную, и эта переменная равна функции в моем модуле, но как мне это сделать?
Я уже пытался заглянуть в код других модулей, таких как черепаха, а черепаха использовала аргумент self, поэтому я попытался использовать его, но он сказал TypeError: win() missing 1 required positional argument: 'self'.
Код моей программы для тестирования модуля:
import zoro
test = zoro.win("test","black",500,500)
test.zoro.winTitle("test2")
Код моего модуля:
from tkinter import *
def win(title,bg,w,h):
root = Tk()
root.title(title)
root.config(bg=bg)
root.geometry(str(w) + "x" + str(h))
return root
def winTitle(title):
root.title(title)
Я хочу сделать так:
test = zoro.win("test","black",500,500)
test.zoro.winTitle("test2")
Я не говорил, что это не работает, я хочу, чтобы люди создавали переменные, а затем использовали их позже.
Похоже, вы описываете классы, и здесь в игру вступает self.
Нет, я просто говорю, что это не сработало.
Похоже, вы хотите иметь возможность использовать переменную root в методе win извне модуля. Если да, то почему бы просто не поставить return root в конце функции?
@Ernxst, что, если пользователь не хочет называть его root, а хочет называть его как-то иначе?
@BEOfficial Неважно, как пользователь хочет это назвать, в вашей функции win вы вызвали окно tkinter root
@Ernxst Мой код теста программы: import zoro test = zoro.win("test","black",500,500) test.zoro.winTitle("test") Код модуля: from tkinter import * def win(title,bg,w,h): root = Tk() root.title(title) root.config(bg=bg) root.geometry(str(w) + "x" + str(h)) return root def winTitle(title): root.title(title)
@BEOfficial Во-первых, это очень трудно читать, обновите свой вопрос, включив это. Во-вторых, если вы уже вернулись root в чем проблема? Пользователь уже может использовать его как обычную переменную.
но я хочу, чтобы они использовали функции zoro, теперь выдает ошибку, что zoro неизвестен в tkinter.
Ваш водитель просто не прав. Объект, возвращаемый zoro.win, не имеет атрибута с именем zoro. Это в дополнение к тому факту, что нет глобальной переменной root для использования winTitle.
@chepner, так как мне это исправить?






Question:
То, что вы хотите сделать, называется inheritance.
Например:
zoro.py
import tkinter as tk
class App(tk.Tk):
def __init__(self, title, bg, width, height):
super().__init__()
self.title(title)
self.geometry('{}x{}'format(width, height)
self.config(bg=bg)
Usage
import zoro
class MyApp(zoro.App):
def __init__(self):
super().__init__("test","black",500,500)
# Change title
self.title('my new title')
# Add further widgets
if __name__ == '__main__':
MyApp().mainloop()
Спасибо, что помогли мне, но мне больше нравится ответ ниже, извините.
Предполагая, что вы хотите, чтобы ваш драйвер работал с модулем, как определено в настоящее время, вам нужна глобальная переменная с именем root для использования winTitle. Кроме того, объект, возвращаемый win, не имеет атрибута с именем zoro.
import zoro
zoro.root = zoro.win("test", "black", 500, 500)
zoro.winTitle("test2")
Тем не менее, ваш модуль должен быть исправлен, чтобы избежать глобальных переменных в первую очередь.
from tkinter import *
def win(title, bg, w, h):
root = Tk()
root.title(title)
root.config(bg=bg)
root.geometry(str(w) + "x" + str(h))
return root
def winTitle(root, title):
root.title(title)
Тогда ваш драйвер будет выглядеть
import zoro
test = zoro.win("test", "black", 500, 500)
zoro.winTitle(test, "test2")
фрагмент кода, которым вы поделились, должен работать правильно; и работает правильно для меня ..