从脚本加载变量

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()