从另一个文件导入 class,但未定义元素名称(可执行示例)
Import class from another file, but element name is not defined (executable example)
3 个示例文件可执行文件是:main.py
、page1.py
和 external_class.py
。 main.py 文件用于启动主 GUI,page1.py 文件包含 class,其中我从 external_class.py 文件导入另一个 class。
问题是 external_class.py 文件的外部 class 无法执行 page1.py 文件的第 1 页 class 的元素。该元素是从 page1.py 文件的 Page1 class 中的组合框获得的,所以我不想在 [=58] 的外部 class 中从头开始重写代码=] 文件,但我只想让外部 class 识别 select_only_way 元素。
在 external_class.py 文件的外部 class 中,我这样使用 select_only_way
self.cursor.execute ('SELECT a, b FROM other WHERE a = ?', [Select_only_way])
。问题就在这里,在 external_class.py 文件的外部 class 中。
我在 external_class.py 文件的外部 class 中遇到错误。
self.cursor.execute('SELECT a, b FROM other WHERE a= =?', [select_only_way])
NameError: name 'select_only_way' is not defined
其他详细信息
main.py 文件和 page1.py 文件都位于同一个主 folder/home/xxx/Desktop/Folder 中。虽然 external_class.py 文件在同一个文件夹中,但它在另一个文件夹中,它包含在另一个文件夹中,所以 /home/xxx/Desktop/Folder/Folder2/Folder3/external_class.py
main.py
import tkinter as tk
from tkinter import ttk
from PIL import ImageTk
from page1 import Page1
from page2 import Page2
root = tk.Tk()
root.geometry('480x320')
topbar = tk.Frame(root, bg='#e10a0a', height=43)
topbar.pack(fill='x')
style = ttk.Style()
style.theme_use('default') # select a theme that allows configuration of ttk.Notebook
# put the tabs at the left with white background
style.configure('TNotebook', tabposition='wn', background='white', tabmargins=0)
# configure tab with white background initially, yellow background when selected
style.configure('TNotebook.Tab', background='white', width=10, focuscolor='yellow', borderwidth=0)
style.map('TNotebook.Tab', background=[('selected', 'yellow')])
nb = ttk.Notebook(root)
nb.pack(fill='both', expand=1)
page1 = Page1(nb)
page2 = Page2(nb, bg='pink', bd=0)
nb.add(page1, text='aaaaa', compound='left')
nb.add(page2, text='bbbbb', compound='left')
root.mainloop()
page1.py
import tkinter as tk
from tkinter import ttk
from Folder.Folder import external_class
import sqlite3
class Page1(tk.Frame):
def __init__(self, master, **kw):
super().__init__(master, **kw)
conn = sqlite3.connect('/...')
cursor = conn.cursor()
#COMBOBOX
def combo_ticket(event=None):
cursor.execute('SELECT ticket FROM aaa')
values = [row[0] for row in cursor]
return values
ticket=ttk.Combobox(self, width = 15)
ticket.place(x=10, y=10)
ticket.set("Ticket Way")
ticket['value'] = combo_ticket()
ticket.bind('<<ComboboxSelected>>', combo_ticket)
select_tricket= ticket.get()
select_only_way= select_tricket.split('>>>')[0]
def click():
k = external_class.External(self.textbox)
#TEXTOBOX
self.textbox = tk.Text(self, width=33, height=10, font=('helvetic', 12))
self.textbox.place(x=30, y=40)
#BUTTON
button = tk.Button(self, text="Ok", command= lambda: [click()])
button.pack()
external_class.py
import sqlite3
class External:
def __init__(self, textbox): # added textbox argument
self.conn = sqlite3.connect('/...')
self.cursor = self.conn.cursor()
self.cursor.execute('SELECT a, b FROM other WHERE a =?', [select_only_way])
self.element = self.cursor.fetchone()
#condition to print text in the textbox of the main.py file
if (self.element and self.element[0] == "try1"):
textbox.insert("end", "ok")
else:
textbox.insert("end", "no")
数据库,通过示例进行了简化,但工作是:
#Combobox Table aaa
CREATE TABLE "aaa" (
"id" INTEGER,
"ticket" INTEGER, #for example "Madrid>>>Tokyo"
PRIMARY KEY("id" AUTOINCREMENT)
);
#other Table
CREATE TABLE "other" (
"id" INTEGER,
"a" INTEGER, #for example "try1"
"b" INTEGER, #for example "try2"
PRIMARY KEY("id" AUTOINCREMENT)
);
我该如何解决?我知道问题所在,也知道错误的原因,但我是 python 的新手,不知道如何解决。你有解决方案给我看吗?非常感谢那些会回答的人。
基本问题是您尚未创建对该属性的引用。
首先,要注意在新对象(classPage1__init__)中的所有属性前面加上self.
前缀。
这使得值成为对象的一部分,并且
可以在初始化后调用。
在您的情况下,整个 class 可以作为参数传递给 External.
class Page1(tk.Frame):
def __init__(self, master, **kw):
super().__init__(master, **kw)
...
self.select_only_way = select_tricket.split('>>>')[0]
...
def click():
k = external_class.External(self)
...
class External:
def __init__(self, Page1): # added textbox argument
...
self.cursor.execute('SELECT a, b FROM other WHERE a =?', [Page1.select_only_way])
...
if (self.element and self.element[0] == "try1"):
Page1.textbox.insert("end", "ok")
...
3 个示例文件可执行文件是:main.py
、page1.py
和 external_class.py
。 main.py 文件用于启动主 GUI,page1.py 文件包含 class,其中我从 external_class.py 文件导入另一个 class。
问题是 external_class.py 文件的外部 class 无法执行 page1.py 文件的第 1 页 class 的元素。该元素是从 page1.py 文件的 Page1 class 中的组合框获得的,所以我不想在 [=58] 的外部 class 中从头开始重写代码=] 文件,但我只想让外部 class 识别 select_only_way 元素。
在 external_class.py 文件的外部 class 中,我这样使用 select_only_way
self.cursor.execute ('SELECT a, b FROM other WHERE a = ?', [Select_only_way])
。问题就在这里,在 external_class.py 文件的外部 class 中。
我在 external_class.py 文件的外部 class 中遇到错误。
self.cursor.execute('SELECT a, b FROM other WHERE a= =?', [select_only_way])
NameError: name 'select_only_way' is not defined
其他详细信息
main.py 文件和 page1.py 文件都位于同一个主 folder/home/xxx/Desktop/Folder 中。虽然 external_class.py 文件在同一个文件夹中,但它在另一个文件夹中,它包含在另一个文件夹中,所以 /home/xxx/Desktop/Folder/Folder2/Folder3/external_class.py
main.py
import tkinter as tk
from tkinter import ttk
from PIL import ImageTk
from page1 import Page1
from page2 import Page2
root = tk.Tk()
root.geometry('480x320')
topbar = tk.Frame(root, bg='#e10a0a', height=43)
topbar.pack(fill='x')
style = ttk.Style()
style.theme_use('default') # select a theme that allows configuration of ttk.Notebook
# put the tabs at the left with white background
style.configure('TNotebook', tabposition='wn', background='white', tabmargins=0)
# configure tab with white background initially, yellow background when selected
style.configure('TNotebook.Tab', background='white', width=10, focuscolor='yellow', borderwidth=0)
style.map('TNotebook.Tab', background=[('selected', 'yellow')])
nb = ttk.Notebook(root)
nb.pack(fill='both', expand=1)
page1 = Page1(nb)
page2 = Page2(nb, bg='pink', bd=0)
nb.add(page1, text='aaaaa', compound='left')
nb.add(page2, text='bbbbb', compound='left')
root.mainloop()
page1.py
import tkinter as tk
from tkinter import ttk
from Folder.Folder import external_class
import sqlite3
class Page1(tk.Frame):
def __init__(self, master, **kw):
super().__init__(master, **kw)
conn = sqlite3.connect('/...')
cursor = conn.cursor()
#COMBOBOX
def combo_ticket(event=None):
cursor.execute('SELECT ticket FROM aaa')
values = [row[0] for row in cursor]
return values
ticket=ttk.Combobox(self, width = 15)
ticket.place(x=10, y=10)
ticket.set("Ticket Way")
ticket['value'] = combo_ticket()
ticket.bind('<<ComboboxSelected>>', combo_ticket)
select_tricket= ticket.get()
select_only_way= select_tricket.split('>>>')[0]
def click():
k = external_class.External(self.textbox)
#TEXTOBOX
self.textbox = tk.Text(self, width=33, height=10, font=('helvetic', 12))
self.textbox.place(x=30, y=40)
#BUTTON
button = tk.Button(self, text="Ok", command= lambda: [click()])
button.pack()
external_class.py
import sqlite3
class External:
def __init__(self, textbox): # added textbox argument
self.conn = sqlite3.connect('/...')
self.cursor = self.conn.cursor()
self.cursor.execute('SELECT a, b FROM other WHERE a =?', [select_only_way])
self.element = self.cursor.fetchone()
#condition to print text in the textbox of the main.py file
if (self.element and self.element[0] == "try1"):
textbox.insert("end", "ok")
else:
textbox.insert("end", "no")
数据库,通过示例进行了简化,但工作是:
#Combobox Table aaa
CREATE TABLE "aaa" (
"id" INTEGER,
"ticket" INTEGER, #for example "Madrid>>>Tokyo"
PRIMARY KEY("id" AUTOINCREMENT)
);
#other Table
CREATE TABLE "other" (
"id" INTEGER,
"a" INTEGER, #for example "try1"
"b" INTEGER, #for example "try2"
PRIMARY KEY("id" AUTOINCREMENT)
);
我该如何解决?我知道问题所在,也知道错误的原因,但我是 python 的新手,不知道如何解决。你有解决方案给我看吗?非常感谢那些会回答的人。
基本问题是您尚未创建对该属性的引用。
首先,要注意在新对象(classPage1__init__)中的所有属性前面加上self.
前缀。
这使得值成为对象的一部分,并且
可以在初始化后调用。
在您的情况下,整个 class 可以作为参数传递给 External.
class Page1(tk.Frame):
def __init__(self, master, **kw):
super().__init__(master, **kw)
...
self.select_only_way = select_tricket.split('>>>')[0]
...
def click():
k = external_class.External(self)
...
class External:
def __init__(self, Page1): # added textbox argument
...
self.cursor.execute('SELECT a, b FROM other WHERE a =?', [Page1.select_only_way])
...
if (self.element and self.element[0] == "try1"):
Page1.textbox.insert("end", "ok")
...