Как использовать рамки и списки для виджета ввода? - PullRequest
0 голосов
/ 02 апреля 2019

Мой код использует метод frame для структурирования метки и записи моего виджета Username.Моя метка называется "unLab", а запись называется "имя пользователя".Фрейм для моего виджета имени пользователя называется usernameFrame.

Однако я хотел бы изменить поле ввода и превратить его в список, но также сохранить фрейм.Как бы я мог сделать это?

То, что я пытался сделать, это прямо ниже.Если я напишу имя пользователя = Entry (END, item), будет возвращено «str не распознается как tk».Спасибо

listbox = Listbox(usernameFrame)
listbox.pack(side = TOP)

listbox.insert(END, "usernames")

for item in ["username1", "username2"]:
    listbox.insert(END, item)
from tkinter import *
root= Tk()
root.title("OCR PPP Program that EVALUATES a student's details")
usernameFrame = Frame(root)
usernameFrame.pack(side = TOP)
large_font = ("Calibri,40")
unLab = Label(usernameFrame,text="Enter username: ",fg="light green",bg="green",font = "Calibri 26 italic",bd=1, relief="solid")
unLab.pack(side = LEFT)
username = Entry(usernameFrame,font=large_font)
username.pack(side = LEFT)
root.mainloop()

1 Ответ

0 голосов
/ 02 апреля 2019

Я думаю, что вы пытаетесь найти Combobox.Это виджет присутствует в tkinter.ttk.Поле со списком предоставляет список значений, которые можно выбрать, или требуемый пользователем текст в записи.Я отредактировал ваш код, чтобы заменить запись комбинированным списком, который имеет 3 варианта: username1, username2 и другие.

uname = StringVar()
username = Combobox(root, textvariable = uname, values = ["username1", "username2", "other"])
username.bind("<<ComboboxSelected>>", usernameSelect)
username.pack(side = LEFT)

Эта функция вызывается всякий раз, когда выбирается новое значение из списка, и включает режим редактирования, если выбрано значение «прочее» (state='normal' означает режим редактирования)

def usernameSelect(event):
if uname.get() not in ["username1", "username2"]:
    username.config(state = 'normal')
    uname.set('')
else:
    username.config(state = 'readonly')

Теперь просто используйте метод uname.get(), чтобы получить значение в Combobox.Вот полный код

from tkinter import *
from tkinter.ttk import Combobox

def usernameSelect(event):
    if uname.get() not in ["username1", "username2"]:
        username.config(state = 'normal')
        uname.set('')
    else:
        username.config(state = 'readonly')

root= Tk()
root.title("OCR PPP Program that EVALUATES a student's details")
usernameFrame = Frame(root)
usernameFrame.pack(side = TOP)
large_font = ("Calibri,40")
unLab = Label(usernameFrame,text="Enter username: ",fg="light green",bg="green",font = "Calibri 26 italic",bd=1, relief="solid")
unLab.pack(side = LEFT)
uname = StringVar()
username = Combobox(root, textvariable = uname, values = ["username1", "username2", "other"] )
username.bind("<<ComboboxSelected>>", usernameSelect)
username.pack(side = LEFT)
root.mainloop()
...