У меня есть 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, также полезны, я действительно просто застрял и нигде не могу найти решение этой проблемы. Все либо «отключение выпадающего списка», либо «отключение кнопки от другой кнопки», оба из которых не работают независимо от того, какие части я меняю и меняю.
Вы можете привязать виртуальное событие <<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()
@Slmd Вы имеете в виду аргумент event
? Это необходимо для обратного вызова события, но в вашем случае оно не используется внутри обратного вызова.
Я имею в виду check_combos прямо над root.mainloop().
Это связано с тем, что значение по умолчанию (None
) аргумента event
используется, когда оно не указано.
Большое спасибо! У меня была эта проблема какое-то время, это действительно очень полезно. Просто спрашиваю, нужно ли мне менять check_combos()? Это все равно работает, если я ничего не добавляю в скобки.