Форум сайта python.su
Здравствуйте, знатоки! Опять написал внешний модуль. Вот он:
import sys import tkinter as tk from tkinter import * def txttagtolist(tags): tag_test = repr(tags[0]) if '<string object: ' in tag_test: clear_tags = [] for i in range(1, len(tags), 2): z = repr(tags[i]) z = z.split(": '")[1] z = z.split("'")[0] clear_tags.append(z) return clear_tags else: # ПРОБЛЕМА ТУТ! #bell() # NameError: name 'bell' is not defined #root.bell() # NameError: name 'root' is not defined tk.bell() # AttributeError: module 'tkinter' has no attribute 'bell' # ПРОБЛЕМА ТУТ! color = sys.stdout.shell color.write("ERROR!\n", "console") try: root.destroy() except: pass sys.exit()
from tkinter import *
Отредактировано Olezhka (Дек. 20, 2022 02:49:09)
Офлайн
Вот пример
>>> import tkinter >>> >>> root = tkinter.Tk() >>> root.bell() >>> root.mainloop() >>>
OlezhkaПри импорте модуля весь импортированный модуль выполняется и всё. А сама инструкция import создаёт имя, к которому привязан этот импортированный модуль в качестве объекта.
Как я понял, при импорте модуля в основную программу весь код модуля выполняется и подключается к основной программе.
>>> import tkinter >>> tkinter <module 'tkinter' from '/usr/lib64/python3.6/tkinter/__init__.py'> >>> >>> import math >>> math <module 'math' from '/usr/lib64/python3.6/lib-dynload/math.cpython-36m-x86_64-linux-gnu.so'> >>> >>> id(math) 140241028221432 >>> >>> math.__doc__ 'This module is always available. It provides access to the\nmathematical functions defined by the C standard.' >>> >>> type(math) <class 'module'> >>>
OlezhkaМодуль просто становится объектом и этот объект привязывается к имени, которое определяется в инструкции import. Имя модуля ничем от других имён не отличается. Ты его можешь добавить в список даже.
Но почему тогда модуль, будучи внедренным в основную программу, не видит, какие еще другие модули подключены в основной программе, не видит переменные, используемые в основной программе, и не может ими пользоваться?
>>> lst = [math, tkinter] >>> lst [<module 'math' from '/usr/lib64/python3.6/lib-dynload/math.cpython-36m-x86_64-linux-gnu.so'>, <module 'tkinter' from '/usr/lib64/python3.6/tkinter/__init__.py'>] >>> >>> out = [i.__doc__ for i in lst] >>> out ['This module is always available. It provides access to the\nmathematical functions defined by the C standard.', 'Wrapper functions for Tcl/Tk.\n\nTkinter provides classes which allow the display, positioning and\ncontrol of widgets. Toplevel widgets are Tk and Toplevel. Other\nwidgets are Frame, Label, Entry, Text, Canvas, Button, Radiobutton,\nCheckbutton, Scale, Listbox, Scrollbar, OptionMenu, Spinbox\nLabelFrame and PanedWindow.\n\nProperties of the widgets are specified with keyword arguments.\nKeyword arguments have the same name as the corresponding resource\nunder Tk.\n\nWidgets are positioned with one of the geometry managers Place, Pack\nor Grid. These managers can be called with methods place, pack, grid\navailable in every Widget.\n\nActions are bound to events by resources (e.g. keyword argument\ncommand) or with the method bind.\n\nExample (Hello, World):\nimport tkinter\nfrom tkinter.constants import *\ntk = tkinter.Tk()\nframe = tkinter.Frame(tk, relief=RIDGE, borderwidth=2)\nframe.pack(fill=BOTH,expand=1)\nlabel = tkinter.Label(frame, text="Hello, World")\nlabel.pack(fill=X, expand=1)\nbutton = tkinter.Button(frame,text="Exit",command=tk.destroy)\nbutton.pack(side=BOTTOM)\ntk.mainloop()\n'] >>>
Отредактировано py.user.next (Дек. 20, 2022 03:57:40)
Офлайн
py.user.nextТак корневое окно у меня в основной программе есть!
А в твоём коде корневого окна нет.
Офлайн
OlezhkaВ этом модуле нет никакого окна вообще.
Опять написал внешний модуль.
Olezhkaroot в основной программе и root в модуле - это абсолютно разные root'ы. Модуль определяет свою систему имён. А имена в модулях могут быть вообще одинаковыми, но при этом связаны с полностью различными объектами.
Так корневое окно у меня в основной программе есть!
from tkinter import *
>>> import math >>> import tkinter >>> >>> math.__name__ 'math' >>> >>> tkinter.__name__ 'tkinter' >>> >>> >>> import tkinter as tk >>> >>> tk.__name__ 'tkinter' >>>
Офлайн
py.user.nextУх ты! Спасибо! Не знал! А еще прикольную инфу выдает имя “__all__”
__doc__
Офлайн
py.user.nextПравда? А я тут провел эксперимент. Я написал модуль “module_test”:
root в основной программе и root в модуле - это абсолютно разные root'ы. Модуль определяет свою систему имён. А имена в модулях могут быть вообще одинаковыми, но при этом связаны с полностью различными объектами
import tkinter as ttk print('2 = ', id(ttk)) root = ttk.Tk() root.title('2') root.mainloop()
import tkinter as tk print('1 = ', id(tk)) root = tk.Tk() root.title('1') import module_test root.mainloop()
from tkinter import * import sys root = Tk() root.after(5000, lambda: sys.exit()) root.mainloop()
Отредактировано Olezhka (Дек. 20, 2022 16:22:01)
Офлайн
OlezhkaУ меня закрылось это окно.
Но проблема в том, что после выполнения “sys.exit()” само окно так и остается висеть. Как так? Вот - сами попробуйте:from tkinter import * import sys root = Tk() root.after(5000, lambda: sys.exit()) root.mainloop()
OlezhkaВсе модули должны импортироваться в самом верху скрипта. Нельзя делать import посередине скрипта.
Далее создал основную программу и вызвал из нее ранее созданный модуль “module_test”:
import math import tkinter def main(): print('hello') print('sin(pi/2) =', math.sin(math.pi / 2)) print('id of tkinter =', id(tkinter)) if __name__ == '__main__': main()
import mod1 def main(): mod1.main() if __name__ == '__main__': main()
Отредактировано py.user.next (Дек. 20, 2022 22:11:07)
Прикреплённый файлы:
modules.tar.gz (563 байта)
Офлайн
py.user.nextА у меня нет. Как так? У меня Win 11. И еще заметил, что все скомпилированные в “PYINSTALLER” “EXE” создают у меня два процесса в “Диспетчере задач”. Почему?
У меня закрылось это окно.
Офлайн
И ты разберись отдельно с модулями, отдельно с функциями, отдельно с tkinter, потому что они друг к другу вообще отношения не имеют. Это разные независимые друг от друга вещи. Твои проблемы с модулями происходят из того, что ты ничего не читал про модули сами. А tkinter к этому вообще никак не относится. Твои проблемы с окнами происходят из того, что ты ничего не читал по tkinter'у. С модулями эти окна вообще никак не связаны. А с функциями тебе нужно разбираться потому, что ты даже не знаешь, что такое пространства имён. Есть пространство имён функции, есть пространство имён модуля, есть пространство имён класса, есть пространство имён объекта. Имена в разных пространствах могут быть абсолютно одинаковыми, но означать абсолютно разные вещи. Ты можешь найти пространство имён на диске, например. Когда ты создаёшь в одной папке файл file.txt и пишешь в него “привет”, а потом создаёшь в другой папке файл file.txt и пишешь в него “пока”, эти оба файла имеют одно и то же имя, но содержат разное содержимое, а пространствами имён здесь являются папки, в которых эти файлы лежат. Так одни папки можно вкладывать в другие папки. Это и есть принцип пространств имён.
Вот пример тебе
#!/usr/bin/env python3 class A: a = '1a' b = '1b' class B: a = '2a' b = A() class C: a = '3a' b = '3b' c = B() obj = C() print(obj.a) print(obj.b) print(obj.c) print(obj.c.a) print(obj.c.b) print(obj.c.b.a) print(obj.c.b.b)
[guest@localhost py]$ ./mod.py
3a
3b
<__main__.B object at 0x7fcfb57f1a58>
2a
<__main__.A object at 0x7fcfb57f1940>
1a
1b
[guest@localhost py]$
Отредактировано py.user.next (Дек. 20, 2022 22:49:42)
Офлайн
OlezhkaА вот это имя “__main__” модуль берет из основной программы? Оно для модуля и для основной программы общее?
if __name__ == ‘__main__’:
Офлайн