如何在不创建无限循环的情况下导入用户定义的变量
How do I import user defined variable without creating infinite loop
当我尝试在另一个脚本中使用用户定义的变量时,我总是陷入循环。但是在花了很长时间修补之后,我无法解决它,并且想知道我做错了什么。我的第一个脚本(STACK_1)是一个 GUI,用户可以在其中从复选框中选择选项:
import tkinter as tk
from tkinter import font
import os
class MyApp(object):
def __init__(self, parent):
"""Constructor"""
self.root = parent
self.root.title("Main frame")
self.frame = tk.Frame(parent)
self.frame.pack()
close_btn = tk.Button(self.frame, text="Close Application", command=self.closeApplication)
close_btn.pack()
global lb
lb = tk.Listbox(self.root, selectmode = "multiple")
lb.place(relx=0.25, rely=0.5, anchor="center")
x =["Choice 1", "Choice 2", "Choice 3"]
for item in range(len(x)):
lb.insert(tk.END, x[item])
lb.itemconfig(item, bg="#ffffff")
tk.Button(self.root, text="Confirm Choices", command=self.confirmSelected).place(relx=0.205, rely=0.62)
Executefile_btn = tk.Button(self.root, text="Run main file", command=self.runfile)
Executefile_btn.place(relx=0.5, rely=0.9)
def closeApplication(self):
self.root.destroy()
def runfile(self):
os.system('python STACK_3.py')
def confirmSelected(self):
planets = []
cname = lb.curselection()
for i in cname:
op = lb.get(i)
planets.append(op)
self.planets = planets
for val in planets:
print(val)
if len(planets) < 2:
print("At least two choices need to be selected")
return planets
我的第二个脚本(STACK_2)初始化另一个 class 并形成 GUI 本身并保存用户选择的变量列表:
import STACK_1
import tkinter as tk
root = tk.Tk()
root.title("N Body Simulation")
root.geometry('400x300')
app = STACK_1.MyApp(root)
root.mainloop()
planets = app.planets
我的第三个脚本(STACK_3)只是打印出通过脚本 1 和 2 生成的列表:
from STACK_2 import planets
print(planets)
但是,随着越来越多的 GUI 生成,脚本 3 导入脚本 2 并因此运行它,它会一直循环。但是,我没有看到不导入脚本 2 的方法。此外,打印功能仅适用于后续生成的 GUI,而不适用于第一个。如果不导入脚本 2,我不理解后者的行为或实现此目的的方法。非常感谢任何帮助。
此脚本有一些问题,但导致无限 windows 被创建的潜在问题在 STACK_1.py.
可以通过更改此文件中的两个函数来解决此问题。
def closeApplication(self):
self.root.destroy()
def runfile(self):
os.system('python STACK_3.py')
首先,程序似乎已经从 STACK_3 被 运行,当调用 运行file 时,将再次调用 STACK_3,调用 STACK_2,重新初始化 GUI。
相反,如果我们只是将此函数替换为
def runfile(self):
self.root.destroy()
现在这与 closeApplication 函数相同。如果您的意图是让 closeApplication 函数完全完成程序,您需要反映这一点,否则它仍会尝试打印行星,这是一个空列表(另请注意,我在 self.planets 中包含了一个赋值MyApp 初始化,因为这是标准的,并且还可以防止在尝试打印行星但不存在时抛出错误。)
def close_application(self):
self.root.destroy()
exit()
另外一定要使用 PEP8 standard 命名函数。
所有这些都是假设脚本是 运行 来自 STACK_3.py。如果不是,为什么要包含 STACK_3.py,只需在 STACK_2.py 中的所有内容之后添加打印行,如果包含这些更改,脚本仍将 运行 相同。
当我尝试在另一个脚本中使用用户定义的变量时,我总是陷入循环。但是在花了很长时间修补之后,我无法解决它,并且想知道我做错了什么。我的第一个脚本(STACK_1)是一个 GUI,用户可以在其中从复选框中选择选项:
import tkinter as tk
from tkinter import font
import os
class MyApp(object):
def __init__(self, parent):
"""Constructor"""
self.root = parent
self.root.title("Main frame")
self.frame = tk.Frame(parent)
self.frame.pack()
close_btn = tk.Button(self.frame, text="Close Application", command=self.closeApplication)
close_btn.pack()
global lb
lb = tk.Listbox(self.root, selectmode = "multiple")
lb.place(relx=0.25, rely=0.5, anchor="center")
x =["Choice 1", "Choice 2", "Choice 3"]
for item in range(len(x)):
lb.insert(tk.END, x[item])
lb.itemconfig(item, bg="#ffffff")
tk.Button(self.root, text="Confirm Choices", command=self.confirmSelected).place(relx=0.205, rely=0.62)
Executefile_btn = tk.Button(self.root, text="Run main file", command=self.runfile)
Executefile_btn.place(relx=0.5, rely=0.9)
def closeApplication(self):
self.root.destroy()
def runfile(self):
os.system('python STACK_3.py')
def confirmSelected(self):
planets = []
cname = lb.curselection()
for i in cname:
op = lb.get(i)
planets.append(op)
self.planets = planets
for val in planets:
print(val)
if len(planets) < 2:
print("At least two choices need to be selected")
return planets
我的第二个脚本(STACK_2)初始化另一个 class 并形成 GUI 本身并保存用户选择的变量列表:
import STACK_1
import tkinter as tk
root = tk.Tk()
root.title("N Body Simulation")
root.geometry('400x300')
app = STACK_1.MyApp(root)
root.mainloop()
planets = app.planets
我的第三个脚本(STACK_3)只是打印出通过脚本 1 和 2 生成的列表:
from STACK_2 import planets
print(planets)
但是,随着越来越多的 GUI 生成,脚本 3 导入脚本 2 并因此运行它,它会一直循环。但是,我没有看到不导入脚本 2 的方法。此外,打印功能仅适用于后续生成的 GUI,而不适用于第一个。如果不导入脚本 2,我不理解后者的行为或实现此目的的方法。非常感谢任何帮助。
此脚本有一些问题,但导致无限 windows 被创建的潜在问题在 STACK_1.py.
可以通过更改此文件中的两个函数来解决此问题。
def closeApplication(self):
self.root.destroy()
def runfile(self):
os.system('python STACK_3.py')
首先,程序似乎已经从 STACK_3 被 运行,当调用 运行file 时,将再次调用 STACK_3,调用 STACK_2,重新初始化 GUI。
相反,如果我们只是将此函数替换为
def runfile(self):
self.root.destroy()
现在这与 closeApplication 函数相同。如果您的意图是让 closeApplication 函数完全完成程序,您需要反映这一点,否则它仍会尝试打印行星,这是一个空列表(另请注意,我在 self.planets 中包含了一个赋值MyApp 初始化,因为这是标准的,并且还可以防止在尝试打印行星但不存在时抛出错误。)
def close_application(self):
self.root.destroy()
exit()
另外一定要使用 PEP8 standard 命名函数。
所有这些都是假设脚本是 运行 来自 STACK_3.py。如果不是,为什么要包含 STACK_3.py,只需在 STACK_2.py 中的所有内容之后添加打印行,如果包含这些更改,脚本仍将 运行 相同。