Как показать и скрыть окно ввода tkinter, когда выбрано yes из выпадающего списка - PullRequest
0 голосов
/ 12 июня 2018

Я создал форму заявки для личного использования с помощью tkinter.Теперь я хочу добавить в него функцию, которая, когда да, если выбрать из выпадающего списка, в противном случае скрыть его.

я написал коды, но он не работает, и выдает ошибку ниже, это фрагмент моегокод

field = ["YES",""]
query_text = StringVar()
lblname = Label(f1aa, font=("arial", 10, "bold"), text="Query/Reply", bd=8, anchor="w")
lblname.grid(row=0, column=0, sticky=W)
txtname28 = OptionMenu(f1aa, query_text, *field)
txtname28.grid(row=0, column=1, sticky=W)

hidden = False
hidden_text = StringVar()
e = Entry(f1aa, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = hidden_text)
e.grid(row=0, column=2)

if query_text == "YES":
    e.grid()
else:
    e.grid_remove()
#hidden = not hidden

полные коды

from tkinter import *
from tkinter import ttk
import random
import time
import datetime
from datetime import date
from tkinter import messagebox
import Backend
import csv
import sqlite3
import re

root = Tk()
root.geometry("1350x750+0+0")
root.title("OTRS Management System")
root.configure(background="gray28")

Tops = Frame(root, width=1350, height=100,bd=14, relief="raise")
Tops.pack(side=TOP)

f1 = Frame(root, width=900, height=650, bd=8, relief="raise")
f1.pack(side=LEFT)

f2 = Frame(root, width=440, height=650,bd=8, relief="raise")
f2.pack(side=RIGHT)

ft2 = Frame(f2, width=440, height=450,bd=12, relief="raise")
ft2.pack(side=TOP)
fb2 = Frame(f2, width=440, height=250,bd=16, relief="raise")
fb2.pack(side=BOTTOM)

f1a = Frame(f1, width=900, height=330,bd=8, relief="raise")
f1a.pack(side=TOP)
f2a = Frame(f1, width=900, height=320,bd=6, relief="raise")
f2a.pack(side=BOTTOM)

f1aa = Frame(f1a, width=400, height=330,bd=16, relief="raise")
f1aa.pack(side=LEFT)
f1ab = Frame(f1a, width=400, height=330,bd=16, relief="raise")
f1ab.pack(side=RIGHT)

f2aa = Frame(f2a, width=450, height=330,bd=14, relief="raise")
f2aa.pack(side=LEFT)
f2ab = Frame(f2a, width=450, height=330,bd=14, relief="raise")
f2ab.pack(side=LEFT)

Tops.configure(background="LightGoldenrod4")
f1.configure(background="LightGoldenrod4")
f2.configure(background="LightGoldenrod4")

field = ["YES",""]

def view_command():
    list1.delete(0,END)
    for row in Backend.view():
        list1.insert(END,row)

def add_command():
    count_total_selected = [query_text.get(),
                            phase_and_tower.get(), saleable_mapping.get(), floor_plans.get(), options.get(), images.get(),
                            cons.get(), video.get(), date.get(), amenities.get(), bank.get(), latlong.get(), usp.get(),
                            facttable.get(), prj_name.get(), prj_desp.get(), specification.get(), builder.get(), tco.get(),
                            brochure.get(), prj_deactivation.get(), np.get(), np2.get(), np_refresh.get()]
    count = 0
    for i in count_total_selected:
        if i=="YES":
            count+=1
    print(count)

    if str(ticket_text.get()).isdigit()== False or len(str(ticket_text.get())) < 4  or ticket_text.get()=="" or agent_text.get()=="" or queue_text.get()=="" or inventory.get()=="":
        toplevel = Toplevel()
        label1 = Label(toplevel, text="***If you are receiving this it means you have forgotten the below points: \n Ticket number is not entered \n Queue is not selected \n Agent Name is not selected.\n Please note if XID number is not available write NA in the BOX\n Please make sure XID number starts with r or c.", height=10, width=55)
        label1.pack()
    else:
        Backend.insert(fdate, ticket_text.get(),agent_text.get(), query_text.get(), queue_text.get(), phase_and_tower.get(),saleable_mapping.get(),floor_plans.get(),options.get(), images.get(),cons.get(), video.get(),date.get(),amenities.get(),bank.get(),latlong.get(), usp.get(), facttable.get(),prj_name.get(),prj_desp.get(),specification.get(),builder.get(),tco.get(),brochure.get(),prj_deactivation.get(),np.get(),np2.get(), inventory.get(), np_refresh.get(), count)
        list1.delete(0,END)
        list1.insert(END,(fdate, ticket_text.get(),agent_text.get(), query_text.get(), queue_text.get(), phase_and_tower.get(),saleable_mapping.get(),floor_plans.get(),options.get(), images.get(),cons.get(), video.get(),date.get(),amenities.get(),bank.get(),latlong.get(), usp.get(), facttable.get(),prj_name.get(),prj_desp.get(),specification.get(),builder.get(),tco.get(),brochure.get(),prj_deactivation.get(),np.get(),np2.get(), inventory.get(), np_refresh.get(), count))

def reset():
    phase_and_tower.set("")
    saleable_mapping.set("")
    floor_plans.set("")
    options.set("")
    images.set("")
    video.set("")
    date.set("")
    amenities.set("")
    prj_deactivation.set("")
    inventory.set("")
    np2.set("")
    bank.set("")
    latlong.set("")
    usp.set("")
    facttable.set("")
    prj_name.set("")
    prj_desp.set("")
    specification.set("")
    builder.set("")
    tco.set("")
    np.set("")
    cons.set("")
    brochure.set("")
    agent_text.set("")
    queue_text.set("")
    np_refresh.set("")
    query_text.set("")
    ticket_text.set("")
def download():
    conn = sqlite3.connect("OtrsSummary.db")
    curs = conn.cursor()
    data = curs.execute("select * from otrs")
    m_dict = list(data.fetchall())
    print(m_dict)

    filename = "Productivity.csv"
    with open("./"+filename,'w') as csvfile:
        csvfile = csv.writer(csvfile, m_dict)
    #csvfile.writerow(titleRow)
        csvfile.writerow(["id","Date","TicketNumber","Agent","QueryReply","Queue","PhasesandTowers","SaleableMapping","Floorplan","Options","Images","ConstructionImages","video","PossessionDate","Amenities","Bank","Location","USP","FactTable","ProjectName","Description","Specificaton","Builder","TCO","Brochure","ProjectDeactivation","NPDeactivation","NewBooking","XID Number","np_refresh","Total"])
        for i in range(0, len( m_dict )):
        #print(alldata1[i])
            csvfile.writerow( m_dict[i]  )

localtime = time.asctime(time.localtime(time.time()))
fdate = date.today()
lblInfo = Label(Tops, font=("arial", 30, "bold"), text="OTRS Management System", fg="SteelBlue4", bd=10)
lblInfo.grid(row=0, column=0)
lblInfo = Label(Tops, font=("arial", 30, "bold"), text=localtime, fg="IndianRed1",bd=10)
lblInfo.grid(row=0, column=1)
#===============================All Functions===================
#===========================#first part=======================
phase_and_tower = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Phases and Tower", bd=8, anchor="w")
lblname2.grid(row=1, column=0, sticky=W)
txtname1 = OptionMenu(f1aa, phase_and_tower, *field)
txtname1.grid(row=1, column=1, sticky=W)


saleable_mapping = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Saleable Mapping", bd=8, anchor="w")
lblname2.grid(row=2, column=0, sticky=W)
txtname2 = OptionMenu(f1aa, saleable_mapping, *field)
txtname2.grid(row=2, column=1, sticky=W)

floor_plans = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Floor Plan", bd=8, anchor="w")
lblname2.grid(row=3, column=0, sticky=W)
txtname3 = OptionMenu(f1aa, floor_plans, *field)
txtname3.grid(row=3, column=1, sticky=W)

options = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Options", bd=8, anchor="w")
lblname2.grid(row=4, column=0, sticky=W)
txtname4 = OptionMenu(f1aa, options, *field)
txtname4.grid(row=4, column=1, sticky=W)

images = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Images", bd=8, anchor="w")
lblname2.grid(row=5, column=0, sticky=W)
txtname5 = OptionMenu(f1aa, images, *field)
txtname5.grid(row=5, column=1, sticky=W)


video = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Video", bd=8, anchor="w")
lblname2.grid(row=6, column=0, sticky=W)
txtname6 = OptionMenu(f1aa, video, *field)
txtname6.grid(row=6, column=1, sticky=W)

##rera = StringVar()
##lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Rera", bd=8, anchor="w")
##lblname2.grid(row=7, column=0, sticky=W)
##txtname7 = Entry(f1aa, font=("arial", 10, "bold"), bd=8, justify="left", textvariable=rera)
##txtname7.grid(row=7, column=1, sticky=W)

date = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Possession Status/Date", bd=8, anchor="w")
lblname2.grid(row=8, column=0, sticky=W)
txtname8 = OptionMenu(f1aa, date, *field)
txtname8.grid(row=8, column=1, sticky=W)

amenities = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Amenities", bd=8, anchor="w")
lblname2.grid(row=9, column=0, sticky=W)
txtname9 = OptionMenu(f1aa, amenities, *field)
txtname9.grid(row=9, column=1, sticky=W)

prj_deactivation = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="Project Deactivation", bd=8, anchor="w")
lblname2.grid(row=10, column=0, sticky=W)
txtname10 = OptionMenu(f1aa, prj_deactivation, *field)
txtname10.grid(row=10, column=1, sticky=W)

inventory = StringVar()
lblname2 = Label(f2ab, font=("arial", 10, "bold"), text="XID Number", bd=8, anchor="w")
lblname2.grid(row=1, column=1, sticky=W)
txtname11 = Entry(f2ab, font=("arial", 10, "bold"), bd=8, justify="left", textvariable=inventory)
txtname11.grid(row=1, column=2, sticky=W)

np2 = StringVar()
lblname2 = Label(f1aa, font=("arial", 10, "bold"), text="New Booking/Resale Lock", bd=8, anchor="w")
lblname2.grid(row=12, column=0, sticky=W)
txtname12 = OptionMenu(f1aa, np2, *field)
txtname12.grid(row=12, column=1, sticky=W)


query_text = StringVar()
lblname = Label(f1aa, font=("arial", 10, "bold"), text="Query/Reply", bd=8, anchor="w")
lblname.grid(row=0, column=0, sticky=W)
txtname28 = OptionMenu(f1aa, query_text, *field)
txtname28.grid(row=0, column=1, sticky=W)

hidden = False
hidden_text = StringVar()
e = Entry(f1aa, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = hidden_text)
e.grid(row=0, column=2)

if query_text == "YES":
    e.grid()
else:
    e.grid_remove()
#hidden = not hidden


#######################################part2=====================
bank = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Bank", bd=8, anchor="w")
lblname2.grid(row=1, column=0, sticky=W)
txtname13 = OptionMenu(f1ab, bank, *field)
txtname13.grid(row=1, column=1, sticky=W)

latlong = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Lat Long/Location", bd=8, anchor="w")
lblname2.grid(row=2, column=0, sticky=W)
txtname14 = OptionMenu(f1ab, latlong, *field)
txtname14.grid(row=2, column=1, sticky=W)

usp = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="USP", bd=8, anchor="w")
lblname2.grid(row=3, column=0, sticky=W)
txtname15 = OptionMenu(f1ab, usp, *field)
txtname15.grid(row=3, column=1, sticky=W)

facttable = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Fact Table", bd=8, anchor="w")
lblname2.grid(row=4, column=0, sticky=W)
txtname16 = OptionMenu(f1ab, facttable, *field)
txtname16.grid(row=4, column=1, sticky=W)

prj_name = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Project Name", bd=8, anchor="w")
lblname2.grid(row=5, column=0, sticky=W)
txtname17 = OptionMenu(f1ab, prj_name, *field)
txtname17.grid(row=5, column=1, sticky=W)

prj_desp = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Project Description", bd=8, anchor="w")
lblname2.grid(row=6, column=0, sticky=W)
txtname18 = OptionMenu(f1ab, prj_desp, *field)
txtname18.grid(row=6, column=1, sticky=W)

specification = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Project Specification", bd=8, anchor="w")
lblname2.grid(row=7, column=0, sticky=W)
txtname19 = OptionMenu(f1ab, specification, *field)
txtname19.grid(row=7, column=1, sticky=W)

builder = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Builer Details", bd=8, anchor="w")
lblname2.grid(row=8, column=0, sticky=W)
txtname20 = OptionMenu(f1ab, builder, *field)
txtname20.grid(row=8, column=1, sticky=W)

tco = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="TCO/Payment Plan", bd=8, anchor="w")
lblname2.grid(row=9, column=0, sticky=W)
txtname21 = OptionMenu(f1ab, tco, *field)
txtname21.grid(row=9, column=1, sticky=W)

np = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="NP Deactivation", bd=8, anchor="w")
lblname2.grid(row=10, column=0, sticky=W)
txtname22 = OptionMenu(f1ab, np, *field)
txtname22.grid(row=10, column=1, sticky=W)

cons = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Construction Images", bd=8, anchor="w")
lblname2.grid(row=11, column=0, sticky=W)
txtname23 = OptionMenu(f1ab, cons, *field)
txtname23.grid(row=11, column=1, sticky=W)

brochure = StringVar()
lblname2 = Label(f1ab, font=("arial", 10, "bold"), text="Brochure", bd=8, anchor="w")
lblname2.grid(row=12, column=0, sticky=W)
txtname24 = OptionMenu(f1ab, brochure, *field)
txtname24.grid(row=12, column=1, sticky=W)


###======EntryWidget for checkboxes=======
#==================for Reset======================
list1=Listbox(ft2, height=22,width=59)
list1.grid(row=2,column=0,rowspan=6,columnspan=2)

sb1=Scrollbar(ft2)
sb1.grid(row=2,column=2,rowspan=6)

list1.configure(yscrollcommand=sb1.set)
sb1.configure(command=list1.yview)

list1.bind('<<ListboxSelect>>')

lblreceipt = Label(ft2, font=("arial", 12, "bold"), text="View Data", bd=2, anchor="w")
lblreceipt.grid(row=1, column=0, sticky=W)

##txtReceipt = Text(ft2, width=59, height=22, bg="white", bd=8, font=("arial", 11, "bold"))
##txtReceipt.grid(row=2, column=0)

##########buttons########################
btnReset = Button(fb2, padx=16,pady=1,bd=4, fg="black", font=("arial", 8, "bold"),width=5,
                   text="Reset", command=reset).grid(row=0, column=1)
btnSubmit = Button(fb2, padx=16, pady=1, bd=4, fg="black", font=("arial", 8, "bold"),width=5,
                   text="Submit", command=add_command).grid(row=0, column=2)
btnExit = Button(fb2, padx=16, pady=1, bd=4, fg="black", font=("arial", 8, "bold"),width=5,
                   text="Exit", command=root.destroy).grid(row=0, column=4)

btnview = Button(fb2, padx=16, pady=1, bd=4, fg="black", font=("arial", 8, "bold"),width=5,
                   text="View Data", command=view_command).grid(row=0, column=3)

download = Button(fb2, padx=16, pady=1, bd=4, fg="black", font=("arial", 8, "bold"),width=5,
                   text="Download Data", command=download).grid(row=1, column=1)

########################################################################################
ticket_text = StringVar()
lblname2 = Label(f2aa, font=("arial", 10, "bold"), text="Ticket Number", bd=8, anchor="w")
lblname2.grid(row=1, column=0, sticky=W)
txtname25 = Entry(f2aa, font=("arial", 10, "bold"), bd=8, justify="left", textvariable=ticket_text)
txtname25.grid(row=1, column=1, sticky=W)

##xid_text = StringVar()
##lblname3 = Label(f2aa, font=("arial", 10, "bold"), text="XID/TID", bd=8, anchor="w")
##lblname3.grid(row=2, column=0, sticky=W)
##txtname26 = Entry(f2aa, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = xid_text)
##txtname26.grid(row=2, column=1, sticky=W)
agents = ["Himani",
"Jhanvi",
"Sandhya",
"Juhi",
"Ruchika",
"Saurabh",
"Neha R",
"Shubhangi",
"Alisha",
"Priya S",
"Khushbu",
"Gaurav",
"Manisha",
"Anjali S",
"Sneha",
"Priyadeep",
"Anjali B",
"Rashi",
"Palak",
"Shivangi",
"Khyati",
"Alok",
"Vikas",
"Tariq",
"Vinay",
"Nupur",
"Mansi"]

agent_text = StringVar()
lblname4 = Label(f2aa, font=("arial", 10, "bold"), text="Agents Name", bd=8, anchor="w")
lblname4.grid(row=3, column=0, sticky=W)
txtname27 = OptionMenu(f2aa, agent_text, *agents)
txtname27.grid(row=3, column=1, sticky=W)

field1 = ["UPGRADES", "CREATION", "MODIFICATION"]
queue_text = StringVar()
lblname2 = Label(f2ab, font=("arial", 10, "bold"), text="Queue", bd=8, anchor="w")
lblname2.grid(row=0, column=1, sticky=W)
txtname29 = OptionMenu(f2ab, queue_text, *field1)
txtname29.grid(row=0, column=2, sticky=W)

np_refresh = StringVar()
lblname31 = Label(f1aa, font=("arial", 10, "bold"), text="NP Slot changes/Refresh", bd=8, anchor="w")
lblname31.grid(row=11, column=0, sticky=W)
txtname31 = OptionMenu(f1aa, np_refresh, *field)
txtname31.grid(row=11, column=1, sticky=W)


##sales_text = StringVar()
##lblname3 = Label(f2ab, font=("arial", 10, "bold"), text="Sales Name", bd=8, anchor="w")
##lblname3.grid(row=2, column=0, sticky=W)
##txtname30 = Entry(f2ab, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = sales_text)
##txtname30.grid(row=2, column=1, sticky=W)

##slot = StringVar()
##lblname2 = Label(f2ab, font=("arial",10,"bold"), text="NP Slot", bd=8, anchor="w")
##lblname2.grid(row=0, column=3, sticky=W)
##txtname31 = Entry(f2ab, font=("arial", 10, "bold"), bd=8, justify="left", textvariable=slot)
##txtname31.grid(row=0, column=4, sticky=W)


##city = StringVar()
##lblname5 = Label(f2ab, font=("arial", 10, "bold"), text="Main City", bd=8, anchor="w")
##lblname5.grid(row=1, column=3, sticky=W)
##txtname32 = Entry(f2ab, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = city)
##txtname32.grid(row=1, column=4, sticky=W)

##comments = StringVar()
##lblname6 = Label(f2ab, font=("arial", 10, "bold"), text="Comments", bd=8, anchor="w")
##lblname6.grid(row=2, column=3, sticky=W)
##txtname33 = Entry(f2ab, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = comments)
##txtname33.grid(row=2, column=4, sticky=W)
##############====connecting db with fromntend====


root.mainloop()

Я добавил полные коды

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вы должны убедиться, что логика для отображения или скрытия поля ввода выполняется каждый раз при изменении выбора OptionMenu.Вы можете сделать это, поместив его в функцию и используя параметр command в OptionMenu:

from tkinter import *

root = Tk()

def hide(choice):
    if choice == "YES":
        e.grid()
    else:
        e.grid_remove()

field = ["YES",""]
query_text = StringVar()
lblname = Label(root, font=("arial", 10, "bold"), text="Query/Reply", bd=8, anchor="w")
lblname.grid(row=0, column=0, sticky=W)
txtname28 = OptionMenu(root, query_text, *field, command=hide)
txtname28.grid(row=0, column=1, sticky=W)

hidden_text = StringVar()
hidden_text.set('Show this text?')
e = Entry(root, font=("arial", 10, "bold"), bd=8, justify="left", textvariable = hidden_text)
e.grid(row=0, column=2)

root.mainloop()
0 голосов
/ 12 июня 2018

То, что вы хотите сделать, это заменить ваш root.mainloop() пользовательским циклом, который вы сделали сами, который включил в него ваше заявление if.Как вы понимаете прямо сейчас, это утверждение будет вызываться только один раз, и это еще до того, как ваш GUI даже начнет работать.Вместо того, чтобы проверять, изменилось ли значение только один раз в начале, нужно постоянно проверять значение.

Проверка того, когда что-то происходит постоянно, это то, что делает root.mainloop(), но вам нужно то, что делает root.mainloop().Так что вам нужен цикл, который вы сделали сами (как я говорил выше), который может проверить, когда значение изменилось, и соответствующим образом обновить GUI.

В вашем цикле вам также необходимо убедиться, что ваш GUI все еще отвечает вручную.Обычно это делается с помощью root.mainloop(), но так как вам нужно заменить его, вам нужно сделать это самостоятельно.Есть несколько способов сделать это, но начните с изучения root.update() и поместите это в свой собственный цикл.

РЕДАКТИРОВАТЬ: На самом деле, вы рассматривали возможность использования флажка вместо выпадающего меню?Вы можете атаковать функцию и заставить ее показывать или скрывать виджет при нажатии на нее.Также вы должны рассмотреть возможность включения и отключения виджета, а не скрывать или показывать его.Это будет означать меньше проблем с макетом

...