从 TopLevel 对象返回值到根对象的 Tkinter 方法
Tkinter method on returning value from TopLevel object to root object
我创建了一个 Tkinter 应用程序,它从另一个文件(用于菜单栏选项)调用 TopLevel
对象。
在我的 main.py
中,我有这个代码:
...
def create():
funct.createNew()
...
menubar = tk.Menu(window)
#file menu
file = tk.Menu(menubar, tearoff=0)
file.add_command(label='Create new', command=create)
...
以及从 functions.py
文件调用的函数(为简单起见,我删除了 window 属性):
def linkToDB():
global create
#call the function to create virtual file
file = sql.generateDB()
#destroy the createNew window
create.destroy()
#debugging purposes
print("Virtual file:", file)
def createNew():
#make this global to destroy this window later
global create
create = tk.Toplevel()
...
#option 1
container1 = tk.Frame(create)
...
#generate virtual SQLite file
btn1 = tk.Button(container1, text="Create", command= lambda: linkToDB())
上面的代码显示了一个TopLevel
window,它将被main.py
中的Create按钮调用,后者又调用了一个函数从 sql.py
(通过 TopLevel
window 中的那个按钮)创建临时 SQlite 文件:
import sqlite3 as sq
#create a virtual sqlite file
def generateDB():
temp = sq.connect(':memory:')
temp.execute...
return temp
我的问题是如何returntemp
的值从generateDB()
到main.py
(特别是在销毁TopLevel
window)?我对如何跨 .py 文件传递这个值感到困惑。以及我的方法是否可行(也在寻求建议)。
P.S。我故意破坏了linkToDB()
中的TopLevel
window,因为它保证会生成我的临时SQlite文件。
您可以将funct.createNew()
修改为return,将虚拟文件修改为main.py
。但是,您需要将顶层 window 设为模态 window,以便 return 顶层 window 被销毁后的虚拟文件。
下面是修改后的functions.py
:
import tkinter as tk
import sql
# pass the toplevel window as an argument instead of using global variable
def linkToDB(create):
# use an attribute of the toplevel window to store the "virtual db file"
create.file = sql.generateDB()
create.destroy()
print('Virtual file:', create.file)
def createNew():
create = tk.Toplevel()
...
container1 = tk.Frame(create)
...
btn1 = tk.Button(container1, text='Create', command=lambda: linkToDB(create))
...
# wait for window destroy (works like a modal dialog)
create.wait_window(create)
# return the "virtual db file"
return create.file
然后就可以在main.py
中得到虚拟db文件了:
def create():
# if you want the "virtual db file" be accessed by other function
# declare it as global variable
#global db_file
db_file = funct.createNew()
print(db_file)
...
...
我创建了一个 Tkinter 应用程序,它从另一个文件(用于菜单栏选项)调用 TopLevel
对象。
在我的 main.py
中,我有这个代码:
...
def create():
funct.createNew()
...
menubar = tk.Menu(window)
#file menu
file = tk.Menu(menubar, tearoff=0)
file.add_command(label='Create new', command=create)
...
以及从 functions.py
文件调用的函数(为简单起见,我删除了 window 属性):
def linkToDB():
global create
#call the function to create virtual file
file = sql.generateDB()
#destroy the createNew window
create.destroy()
#debugging purposes
print("Virtual file:", file)
def createNew():
#make this global to destroy this window later
global create
create = tk.Toplevel()
...
#option 1
container1 = tk.Frame(create)
...
#generate virtual SQLite file
btn1 = tk.Button(container1, text="Create", command= lambda: linkToDB())
上面的代码显示了一个TopLevel
window,它将被main.py
中的Create按钮调用,后者又调用了一个函数从 sql.py
(通过 TopLevel
window 中的那个按钮)创建临时 SQlite 文件:
import sqlite3 as sq
#create a virtual sqlite file
def generateDB():
temp = sq.connect(':memory:')
temp.execute...
return temp
我的问题是如何returntemp
的值从generateDB()
到main.py
(特别是在销毁TopLevel
window)?我对如何跨 .py 文件传递这个值感到困惑。以及我的方法是否可行(也在寻求建议)。
P.S。我故意破坏了linkToDB()
中的TopLevel
window,因为它保证会生成我的临时SQlite文件。
您可以将funct.createNew()
修改为return,将虚拟文件修改为main.py
。但是,您需要将顶层 window 设为模态 window,以便 return 顶层 window 被销毁后的虚拟文件。
下面是修改后的functions.py
:
import tkinter as tk
import sql
# pass the toplevel window as an argument instead of using global variable
def linkToDB(create):
# use an attribute of the toplevel window to store the "virtual db file"
create.file = sql.generateDB()
create.destroy()
print('Virtual file:', create.file)
def createNew():
create = tk.Toplevel()
...
container1 = tk.Frame(create)
...
btn1 = tk.Button(container1, text='Create', command=lambda: linkToDB(create))
...
# wait for window destroy (works like a modal dialog)
create.wait_window(create)
# return the "virtual db file"
return create.file
然后就可以在main.py
中得到虚拟db文件了:
def create():
# if you want the "virtual db file" be accessed by other function
# declare it as global variable
#global db_file
db_file = funct.createNew()
print(db_file)
...
...