Возникли проблемы с получением значения поля со списком для включения/отключения кнопки Python Tkinter

У меня есть 2 поля со списком: страна и год. Они могут менять по 2 разных метки соответственно. Кнопка findbutton (внизу кода) позволяет им сделать это, используя def searchget(). Это работает, поскольку метки используют StringVars, которые меняются в зависимости от того, что вводится в поля со списком, а определение обновляет их с помощью вышеупомянутой кнопки. Итак, эта часть работает нормально. Но меня по-прежнему озадачивает то, как запретить пользователю нажимать кнопку поиска (отключить ее), если значения поля со списком, выбранные для каждого или обоих, равны 0 (country = --COUNTRY-- и/или год = --YEAR- -). делает ли .current(0) так, что это не работает? Я по-прежнему хочу, чтобы значение по умолчанию было 0, но если пользователь хочет что-то найти, это должно быть что-то другое для года и страны.

Вот весь мой код, если на него влияет что-то кроме полей со списком, меток, def или кнопки:

#!/bin/python3

#7f7f7f, #679969, #c3c3c3

#Imports
import tkinter as tk
from tkinter import ttk
from tkinter import *

#Windows
root = Tk()
root.title("GovGrants")

#Window Interface
root.geometry("400x500")
root['bg'] = "#7f7f7f"

#defs
def searchget():
    countryTitle.set(country.get())
    yearTitle.set(year.get())
    root.update()

def options():
    OPTIONS = Toplevel(root)
    OPTIONS.geometry("400x500")
    OPTIONS['bg'] = "#7f7f7f"
    optionsTitle = Label(OPTIONS, text = "Does nothing so far.\nSorry.", bg = "#c3c3c3").place(x=10, y=10)
    

#Icons and text
#root.wm_attributes('-transparentcolor', '#679969')
MainTitle = Label(root,
                  text = "Enterprise and Small Business Grants and\nSupport from the Governments (By Country)", font=("Arial Bold", 10),
                  width = 44, height = 3, borderwidth = 3, relief = "solid",
                  bg = "#c3c3c3").place(x=20, y=10)



#Buttons, dropdowns etc
    
#Combobox country
a = tk.StringVar() 
country = ttk.Combobox(root, width = 20, textvariable = a)
#w15
   
country['values'] = (' --COUNTRY--',  
                     ' Australia',  
                     ' Austria', 
                     ' Belgium', 
                     ' Canada', 
                     ' Czechia', 
                     ' Denmark', 
                     ' Estonia', 
                     ' Finland', 
                     ' France', 
                     ' Germany', 
                     ' Greece', 
                     ' Hungary',
                     ' Ireland',
                     ' Israel',
                     ' Italy',
                     ' Japan',
                     ' Korea',
                     ' Latvia',
                     ' Lithuania',
                     ' Luxembourg',
                     ' Netherlands',
                     ' New Zealand',
                     ' Norway',
                     ' Poland',
                     ' Portugal',
                     ' Slovak Republic',
                     ' Slovenia',
                     ' Spain',
                     ' Sweden',
                     ' Switzerland',
                     ' United Kingdom',
                     ' United States',
                     ' Referance Area: Non-OECD economies > Bulgaria',
                     ' Croatia',
                     ' Romania',
                     ' Russia',
                     ' South Africa') 
  
country['state'] = 'readonly'
country.place(x=80, y=70)
country.current(0)

#Combobox year
b = tk.StringVar() 
year = ttk.Combobox(root, width = 10, textvariable = b)
#w5
   
year['values'] = (' --YEAR--',    
                  ' 2002',
                  ' 2003', 
                  ' 2004', 
                  ' 2005', 
                  ' 2006', 
                  ' 2007', 
                  ' 2008', 
                  ' 2009', 
                  ' 2011', 
                  ' 2012', 
                  ' 2013', 
                  ' 2014', 
                  ' 2015', 
                  ' 2016', 
                  ' 2017', 
                  ' 2018', 
                  ' 2019', 
                  ' 2020', 
                  ' 2021', 
                  ' 2022', 
                  ' 2023') 
                           
  
year['state'] = 'readonly'
year.place(x=237, y=70) 
year.current(0)

#.get()
countryTitle = StringVar()
countryTitle.set(country.get())
yearTitle = StringVar()
yearTitle.set(year.get())

#grant actually showing
dataTitle = Label(root, text = "Data:", bg = "#7f7f7f", fg = "#FFFFFF").place(x=20, y=95)
businessSTitle = Label(root, text = "Business Stage", bg = "#7f7f7f", fg = "#FFFFFF").place(x=20, y=120)

countryTitlea = Label(root, textvariable = countryTitle, bg = "#7f7f7f", fg = "#FFFFFF").place(x=120, y=135)
yearTitlea = Label(root, textvariable = yearTitle, bg = "#7f7f7f", fg = "#FFFFFF").place(x=200, y=135)

seedTitle = Label(root, text = "Seed", font=("TkDefaultFont", 9), width = 9, height = 1, borderwidth = 2, relief = "solid", bg = "#c3c3c3").place(x=99, y=160)
startupTitle = Label(root, text = "Start-up", font=("TkDefaultFont", 9), width = 9, height = 1, borderwidth = 2, relief = "solid", bg = "#c3c3c3").place(x=165, y=160)
latestageTitle = Label(root, text = "Late-stage", font=("TkDefaultFont", 9), width = 9, height = 1, borderwidth = 2, relief = "solid", bg = "#c3c3c3").place(x=232, y=160)
totalTitle = Label(root, text = "Total", font=("TkDefaultFont", 9), width = 9, height = 1, borderwidth = 2, relief = "solid", bg = "#c3c3c3").place(x=299, y=160)
GATitle = Label(root, text = "Grant Average\n($US Million)", borderwidth = 1, relief = "solid", bg = "#c3c3c3").place(x=20, y=180)
adTitle = Label(root, text = "$", width = 9, height = 2, borderwidth = 1, relief = "solid", bg = "#c3c3c3", anchor = "w").place(x=99, y=180)
bdTitle = Label(root, text = "$", width = 9, height = 2, borderwidth = 1, relief = "solid", bg = "#c3c3c3", anchor = "w").place(x=166, y=180)
cdTitle = Label(root, text = "$", width = 9, height = 2, borderwidth = 1, relief = "solid", bg = "#c3c3c3", anchor = "w").place(x=233, y=180)
ddTitle = Label(root, text = "$", width = 9, height = 2, borderwidth = 1, relief = "solid", bg = "#c3c3c3", anchor = "w").place(x=300, y=180)

#Extra-type
businessTTitle = Label(root, text = "Business Type", bg = "#7f7f7f", fg = "#FFFFFF").place(x=20, y=230)

countryTitleb = Label(root, textvariable = countryTitle, bg = "#7f7f7f", fg = "#FFFFFF").place(x=120, y=250)
yearTitleb = Label(root, textvariable = yearTitle, bg = "#7f7f7f", fg = "#FFFFFF").place(x=200, y=250)

assistanceTitle = Label(root, text = "Assistance", font=("TkDefaultFont", 9), width = 9, height = 1, borderwidth = 2, relief = "solid", bg = "#c3c3c3").place(x=165, y=270)
fundingTitle = Label(root, text = "Funding", font=("TkDefaultFont", 9), width = 9, height = 1, borderwidth = 2, relief = "solid", bg = "#c3c3c3").place(x=232, y=270)
itemTitle = Label(root, text = "Business", font=("TkDefaultFont", 9), width = 9, height = 1, borderwidth = 2, relief = "solid", bg = "#c3c3c3").place(x=98, y=270)
at = Label(root, text = " \n \n \n \n \n \n \n \n", width = 9, borderwidth = 1, relief = "solid", bg = "#c3c3c3", anchor = "w").place(x=166, y=290)
ft = Label(root, text = " \n \n \n \n \n \n \n \n", width = 9, borderwidth = 1, relief = "solid", bg = "#c3c3c3", anchor = "w").place(x=233, y=290)
it = Label(root, text = " \n \n \n \n \n \n \n \n", width = 9, borderwidth = 1, relief = "solid", bg = "#c3c3c3", anchor = "w").place(x=99, y=290)

#Buttons
optionsButton = Button(root, text = "Settings", width = 6, command = options).place(x=20, y=68)
findButton = Button(root, text = "Search", width = 6, command = searchget).place(x=329, y=68)

if country.get() == '--COUNTRY--':
    findbutton['state'] = 'disabled';

elif year.get() == '--YEAR--':
    findbutton['state'] = 'disabled';

#41 to 20 (21)
#boxes #c3c3c3

root.mainloop()

#######################################################

Я обыскал все веб-сайты с вопросами по коду, w3schools и другие веб-сайты с практическими рекомендациями, но, похоже, ничего не работает. Я подозреваю, что это как-то связано с тем, как получается информация в поле со списком (я пробовал Country.get() = 0, Country = "--COUNTRY--", Country.get() = "--COUNTRY--" , (есть еще кое-что, но на самом деле это просто разные комбинации кавычек и общих ответов) почти все возможные комбинации.) или как кнопка меняет состояние (еще раз попробовал findbutton = "DISABLED", findbutton['state') ] = «отключено» (просто разные комбинации кавычек и все распространенные ответы). Когда я нажимаю кнопку, ошибок не появляется, но оператор if не существует.

Кстати: ответы, не связанные с операторами if, также полезны, я действительно просто застрял и нигде не могу найти решение этой проблемы. Все либо «отключение выпадающего списка», либо «отключение кнопки от другой кнопки», оба из которых не работают независимо от того, какие части я меняю и меняю.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете привязать виртуальное событие <<ComboboxSelected>> к двум полям со списком и обновить состояние findButton на основе выбранных значений этих полей со списком внутри обратного вызова события.

Также избегайте чего-то вроде утверждения ниже:

findButton = Button(...).place(...)

потому что findButton будет None, поскольку это результат .place(...).

Необходимые изменения для вашего случая:

...

findButton = Button(root, text = "Search", width=6, command=searchget)
findButton.place(x=329, y=68)

def check_combos(event=None):
    state = 'disabled' if (a.get() == country['values'][0] or b.get() == year['values'][0]) else 'normal'
    findButton.config(state=state)

country.bind('<<ComboboxSelected>>', check_combos)
year.bind('<<ComboboxSelected>>', check_combos)

check_combos() # set button state initially
root.mainloop()

Большое спасибо! У меня была эта проблема какое-то время, это действительно очень полезно. Просто спрашиваю, нужно ли мне менять check_combos()? Это все равно работает, если я ничего не добавляю в скобки.

Slmd 28.08.2024 05:43

@Slmd Вы имеете в виду аргумент event? Это необходимо для обратного вызова события, но в вашем случае оно не используется внутри обратного вызова.

acw1668 28.08.2024 05:48

Я имею в виду check_combos прямо над root.mainloop().

Slmd 28.08.2024 06:37

Это связано с тем, что значение по умолчанию (None) аргумента event используется, когда оно не указано.

acw1668 28.08.2024 07:18

Другие вопросы по теме