从脚本加载变量
Load variable from script
我知道这是一个常见问题,但我找不到与我的类似的解决方案。
我有两个程序文件 - 一个 GUI 文件 (tkinter) 和主文件,它为 Gui 提供输入。
它工作正常,直到我想将 OptionMenu 放入 GUI 文件中,它从主文件中获取列表。
我知道这通常适用于:
from GUI-File import variable_from_Main-File
但是!当我这样做时,整个文件在 GUI 完成之前加载,所以变量只是在某些点上未定义。
为了更好的理解,代码如下:
第一个主文件
import xml.etree.ElementTree as ET
import DLE_Gui as gui
xmlOriginUp = open('%s' %gui.load.Filename, 'r')
xmlOrigin = ET.parse(xmlOriginUp)
elemList = []
tags = []
for elem in xmlOrigin.iter():
elemList.append(elem)
for ta in range(len(elemList)):
tags.append(elemList[ta].tag)
以及 GUI 文件:
import tkinter
from tkinter import filedialog, Tk, Button, LabelFrame, Label, Entry, messagebox, Text, OptionMenu, StringVar
from tkinter.filedialog import askopenfilename
from DLE_v200609 import tags
def fin():
gui.destroy()
def load():
load.Filename = askopenfilename(filetypes=(("XML", "*.xml"),("All files", "*.*")))
print(load.Filename)
Label(text=load.Filename, bg="white", borderwidth=2, relief="sunken").grid(row=1, column=1)
gui = tkinter.Tk()
gui.title('Dante Label XML-Export')
Label(text='Öffnen:').grid(row=1, sticky='w', padx=5, pady=5)
Label(bg="white", borderwidth=2, relief="sunken").grid(row=1, column=1, ipadx=178)
Button(text='dursuchen...', command=load).grid(row=1, column=2, ipadx=5)
Label(text='Label:').grid(row=2, sticky='w', padx=5, pady=5)
var = StringVar(gui)
var.set('---')
optMen = OptionMenu(gui, var, tags)
optMen.grid(row=2, column=1)
Button(text='Schließen', command=fin).grid(row=4, column=2, padx=10, pady=10)
gui.mainloop()
所以我想要列表 'tags[]' 作为 GUI 中选项菜单的变量列表。
程序的答案是:
xmlOriginUp = open('%s' %gui.load.Filename, 'r')
AttributeError: module 'DLE_Gui' has no attribute 'load'
有人知道我该如何解决吗?
你所有关于两个文件的想法似乎都是错误的。
您可以将所有代码放在一个文件中以使其更简单。
要创建标签,您必须读取文件,但要获取文件名,您必须使用运行 load()
的按钮显示 GUI - 但同时您尝试获取文件名而不显示 GUI 且没有 运行 load()
.
您应该以空 OptionMenu
作为开始创建 GUI
option_menu = tk.OptionMenu(gui, var, '---')
在从文件加载数据之前显示它 OptionMenu
当您按下 Button
时,load()
应该读取文件并将项目添加到 OptionMenu
for item in xmlOrigin.iter():
option_menu['menu'].add_command(label=item.tag)
最少的工作代码
import tkinter as tk
from tkinter.filedialog import askopenfilename
import xml.etree.ElementTree as ET
# --- functions ---
def load():
filename = askopenfilename(filetypes=(("XML", "*.xml"),("All files", "*.*")))
print(filename)
label_filename['text'] = filename
xmlOriginUp = open(filename)
xmlOrigin = ET.parse(xmlOriginUp)
for item in xmlOrigin.iter():
option_menu['menu'].add_command(label=item.tag)
# --- main ---
gui = tk.Tk()
gui.title('Dante Label XML-Export')
l = tk.Label(text='Öffnen:')
l.grid(row=1, sticky='w', padx=5, pady=5)
label_filename = tk.Label(bg="white", borderwidth=2, relief="sunken")
label_filename.grid(row=1, column=1, ipadx=178)
b = tk.Button(text='dursuchen...', command=load)
b.grid(row=1, column=2, ipadx=5)
l = tk.Label(text='Label:')
l.grid(row=2, sticky='w', padx=5, pady=5)
option_menu_var = tk.StringVar(gui)
option_menu_var.set('---')
option_menu = tk.OptionMenu(gui, option_menu_var, '---') # create empty OptionMenu
option_menu.grid(row=2, column=1)
b = tk.Button(text='Schließen', command=gui.destroy)
b.grid(row=4, column=2, padx=10, pady=10)
gui.mainloop()
我知道这是一个常见问题,但我找不到与我的类似的解决方案。 我有两个程序文件 - 一个 GUI 文件 (tkinter) 和主文件,它为 Gui 提供输入。
它工作正常,直到我想将 OptionMenu 放入 GUI 文件中,它从主文件中获取列表。
我知道这通常适用于:
from GUI-File import variable_from_Main-File
但是!当我这样做时,整个文件在 GUI 完成之前加载,所以变量只是在某些点上未定义。
为了更好的理解,代码如下:
第一个主文件
import xml.etree.ElementTree as ET
import DLE_Gui as gui
xmlOriginUp = open('%s' %gui.load.Filename, 'r')
xmlOrigin = ET.parse(xmlOriginUp)
elemList = []
tags = []
for elem in xmlOrigin.iter():
elemList.append(elem)
for ta in range(len(elemList)):
tags.append(elemList[ta].tag)
以及 GUI 文件:
import tkinter
from tkinter import filedialog, Tk, Button, LabelFrame, Label, Entry, messagebox, Text, OptionMenu, StringVar
from tkinter.filedialog import askopenfilename
from DLE_v200609 import tags
def fin():
gui.destroy()
def load():
load.Filename = askopenfilename(filetypes=(("XML", "*.xml"),("All files", "*.*")))
print(load.Filename)
Label(text=load.Filename, bg="white", borderwidth=2, relief="sunken").grid(row=1, column=1)
gui = tkinter.Tk()
gui.title('Dante Label XML-Export')
Label(text='Öffnen:').grid(row=1, sticky='w', padx=5, pady=5)
Label(bg="white", borderwidth=2, relief="sunken").grid(row=1, column=1, ipadx=178)
Button(text='dursuchen...', command=load).grid(row=1, column=2, ipadx=5)
Label(text='Label:').grid(row=2, sticky='w', padx=5, pady=5)
var = StringVar(gui)
var.set('---')
optMen = OptionMenu(gui, var, tags)
optMen.grid(row=2, column=1)
Button(text='Schließen', command=fin).grid(row=4, column=2, padx=10, pady=10)
gui.mainloop()
所以我想要列表 'tags[]' 作为 GUI 中选项菜单的变量列表。 程序的答案是:
xmlOriginUp = open('%s' %gui.load.Filename, 'r')
AttributeError: module 'DLE_Gui' has no attribute 'load'
有人知道我该如何解决吗?
你所有关于两个文件的想法似乎都是错误的。
您可以将所有代码放在一个文件中以使其更简单。
要创建标签,您必须读取文件,但要获取文件名,您必须使用运行 load()
的按钮显示 GUI - 但同时您尝试获取文件名而不显示 GUI 且没有 运行 load()
.
您应该以空 OptionMenu
作为开始创建 GUI
option_menu = tk.OptionMenu(gui, var, '---')
在从文件加载数据之前显示它 OptionMenu
当您按下 Button
时,load()
应该读取文件并将项目添加到 OptionMenu
for item in xmlOrigin.iter():
option_menu['menu'].add_command(label=item.tag)
最少的工作代码
import tkinter as tk
from tkinter.filedialog import askopenfilename
import xml.etree.ElementTree as ET
# --- functions ---
def load():
filename = askopenfilename(filetypes=(("XML", "*.xml"),("All files", "*.*")))
print(filename)
label_filename['text'] = filename
xmlOriginUp = open(filename)
xmlOrigin = ET.parse(xmlOriginUp)
for item in xmlOrigin.iter():
option_menu['menu'].add_command(label=item.tag)
# --- main ---
gui = tk.Tk()
gui.title('Dante Label XML-Export')
l = tk.Label(text='Öffnen:')
l.grid(row=1, sticky='w', padx=5, pady=5)
label_filename = tk.Label(bg="white", borderwidth=2, relief="sunken")
label_filename.grid(row=1, column=1, ipadx=178)
b = tk.Button(text='dursuchen...', command=load)
b.grid(row=1, column=2, ipadx=5)
l = tk.Label(text='Label:')
l.grid(row=2, sticky='w', padx=5, pady=5)
option_menu_var = tk.StringVar(gui)
option_menu_var.set('---')
option_menu = tk.OptionMenu(gui, option_menu_var, '---') # create empty OptionMenu
option_menu.grid(row=2, column=1)
b = tk.Button(text='Schließen', command=gui.destroy)
b.grid(row=4, column=2, padx=10, pady=10)
gui.mainloop()