Извините, это может быть вопрос новичка, но я, похоже, не нашел свой ответ.
У меня есть 2 модуля Python: source.py и work.py. Я хочу использовать source.py в качестве модуля, в котором можно определить некоторые функции tkinter, а затем использовать их в work.py.
В source.py я создал функцию со списком, которая запоминает нужный параметр в переменной с именем «e». Переменная "e" объявлена глобальной.
Если я запускаю функцию со списком в модуле source.py как «основную», переменная e будет изменяться каждый раз, когда я выбираю другую опцию из поля со списком. Он работает так, как ожидалось
Однако, если я импортирую поле со списком во второй модуль «work.py». тогда переменная e не изменяется, а остается в исходном присвоенном значении.
Как я могу изменить сценарий, чтобы «e» менялось при вызове функции со списком из work.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()
работа.ру:
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 через поле со списком, чтобы я мог использовать ее после этого. И это не меняется. Он остается на исходном значении ("y"). Но та же часть кода в «основном»… если я запускаю этот код в модуле 1 (исходный код)… там он работает. Переменная "е" меняется. Значение e должно меняться в зависимости от того, что я выбираю в поле со списком: один, два, три, четыре.
Итак, вы пытаетесь получить значение из поля со списком, созданного в функции в другом модуле, верно?
ага. Вот и все. И мне удается получить значение, если я запускаю функцию в исходном модуле. Он изменяет «переменную e» одним из значений выпадающего списка. К сожалению, это не меняет переменную " e ", если я запускаю ту же, но на этот раз импортированную функцию во втором модуле.
Ваш вопрос остается для меня загадкой, но я предполагаю, что у вас возникли проблемы с получением значения Combobox
, сделанного в функции внутри source.py. Вы можете просто вернуть 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
? e
, созданные в source.py и work.py, отличаются и не совпадают. Действительно, я думаю, что правильный способ получить доступ к свойствам Combobox
— это то, что я сказал.
Это работает, если я поместил функцию со списком внутри work.py. К сожалению, я не могу этого сделать, потому что source.py служит цели для более крупного проекта, в нем также будут другие функции, которые можно использовать в качестве ссылки для других «рабочих» модулей. Поэтому я не могу повторять функции в каждом «рабочем» модуле, который я создаю. :)
@VoicuMirel Не стоит. Просто замените функцию на ту, что я дал, в source.py. И сделать необходимые приготовления на work.py
это полностью сработало. Задача решена. Пожалуйста, спасибо
Я не понимаю, чего вы ожидаете во втором сценарии. «тогда переменная e не изменяется, а остается в исходном присвоенном значении». Какую ценность
e
вы ожидаете.