从另一个文件导入 class,但未定义元素名称(可执行示例)

Import class from another file, but element name is not defined (executable example)

3 个示例文件可执行文件是:main.pypage1.pyexternal_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")
        ...