在另一个模块中调用时,tkinter 组合框功能不起作用

Posted

技术标签:

【中文标题】在另一个模块中调用时,tkinter 组合框功能不起作用【英文标题】:tkinter combobox function not working when called in another module 【发布时间】:2021-03-21 00:22:07 【问题描述】:

抱歉,这可能是一个初学者问题,但我似乎没有找到答案。

我有 2 个 python 模块:source.pywork.py. 我想使用 source.py 作为模块定义一些 tkinter 函数,然后在 work.py 中使用它们。

在 source.py 中,我创建了一个组合框函数,该函数将所需选项存储在名为“e”的变量中。变量“e”被声明为全局变量。

如果我将 source.py 模块中的组合框函数作为“main”运行,则每次我从组合框中选择另一个选项时,变量 e 都会更改。它按预期工作

但是,如果我在第二个模块“work.py”中导入组合框。那么变量 e 不会改变,而是保持初始分配的值。

如何更改脚本,以便在从 work.py 调用组合框函数时更改“e”?

我的模块如下:

source.py:

from tkinter import *
from PIL import ImageTk, Image
from tkinter import ttk

def add_combo_box(root,lst,row,column):
    global e
    def comboclick(event):
        global e
        e=myCombo.get()
        #myLabel = Label(root, text=myCombo.get())
        #myLabel.pack()
        print('e from combobox: ',e)

    # create dropdown box
    options = lst
    myCombo = ttk.Combobox(root, value=options, width=40)
    #myCombo.current(0)
    myCombo.bind("<<ComboboxSelected>>", comboclick)
    myCombo.grid(row=row,column=column)

#when running here it works ok. Variable "e" is getting changed
if __name__=='__main__':

    root = Tk()
    e="x"
    options = ['one', 'two', 'three', 'four']
    add_combo_box(root,options,row=1,column=1)

    def display():
        global e
        messagebox.showinfo("", str(e))

    btn=Button(root,text='show value',command=display)
    btn.grid(row=2,column=1)


    root.mainloop()

work.py:

from tkinter import *
from PIL import ImageTk,Image
from tkinter import ttk
from source import add_combo_box
from tkinter import messagebox

#here it doesn't work. Combobox is launching. Variable "e" is gettting initialised with "y" value but after calling the combobox function it stays the same

if __name__=='__main__':

    root = Tk()
    global e
    e = "y"
    options = ['one', 'two', 'three', 'four']
    add_combo_box(root, options, row=1, column=1)

    def display():
        global e
        messagebox.showinfo("", str(e))

    btn = Button(root, text='show value', command=display)
    btn.grid(row=2, column=1)

    root.mainloop()


【问题讨论】:

我不明白你期望在第二个脚本中发生什么。 "那么变量 e 没有改变,而是保持在初始分配的值。" 你期望的 e 的值是多少。 在第二个脚本中,我想通过组合框更改变量 e,以便之后可以使用它。而且它没有改变。它保持在初始值。(“y”)。但是“main”下的同一部分代码......如果我在模块1(源代码)中运行该代码......它可以工作。变量“e”正在改变。值 e 必须根据我在组合框中选择的内容进行更改:一、二、三、四 所以你试图从另一个模块的函数中创建的组合框中获取值对吗? 是的。差不多就是这样。如果我在源模块中运行该功能,我设法获得价值。它使用组合框值之一更改“e 变量”。不幸的是,如果我运行相同但这次在第二个模块中导入函数,它不会更改“ e ”变量 【参考方案1】:

您的问题对我来说仍然是个谜,但我假设您在获取 source.py 内部函数中的 Combobox 的值时遇到了麻烦。您可以从函数中返回 Combobox 并为其分配一个变量,然后在其上使用 get() 方法,例如:

def add_combo_box(root,lst,row,column):

    def comboclick(event):
        e=myCombo.get()
        #myLabel = Label(root, text=myCombo.get())
        #myLabel.pack()
        print('e from combobox: ',e)

    # create dropdown box
    myCombo = ttk.Combobox(root, value=lst, width=40)
    #myCombo.current(0)
    myCombo.bind("<<ComboboxSelected>>", comboclick)
    myCombo.grid(row=row,column=column)
    return myCombo #return the combobox

work.py 内部:

if __name__=='__main__':

    root = Tk()
    e = "y"
    options = ['one', 'two', 'three', 'four']
    ahem = add_combo_box(root, options, row=1, column=1) #assign a variable to it

    def display():
        messagebox.showinfo("", str(ahem.get())) #use the get on the variable to get the value of the combobox made

    btn = Button(root, text='show value', command=display)
    btn.grid(row=2, column=1)

    root.mainloop()

为什么这不适用于e? source.py 和 work.py 中创建的e 不一样也不一样。确实,我认为访问Combobox 属性的正确方法就像我说的那样。

【讨论】:

如果我将组合框函数放在 work.py 中,它就可以工作。可悲的是,我不能这样做,因为 source.py 服务于一个更大的项目的目的,其中还包含其他功能,可用作其他“工作”模块的参考。所以我不能在我创建的每个“工作”模块中重复这些功能。 :) @VoicuMirel 你不应该。只需在 source.py 中将函数替换为我提供的函数即可。并在work.py上做必要的安排 它完全奏效了。问题解决了。非常感谢

以上是关于在另一个模块中调用时,tkinter 组合框功能不起作用的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用在另一个控件事件中的表单加载时创建的控件

Tkinter 如何正确设置组合框滚动条的样式

Python - 如何在另一个模块中调用模块的主要功能?

如果有 0 或 1 个项目,如何创建没有箭头的自定义 tkinter 组合框?

文件加密时 Tkinter 滞后

我可以双击 tkinter 列表框选项来调用 Python 中的函数吗?