我正在使用 tkinter 獲取要打開的檔案路徑,然后向用戶詢問兩個問題,通過文本輸入小部件命名,并通過一些單選按鈕進行課程。我從該執行緒的答案中獲得的單選按鈕的代碼效果很好: 如何使用 tkInter 顯示一個詢問用戶多項選擇問題的對話框? 然后我決定添加 Entry 小部件以獲得名稱問題的答案并且一直在苦苦掙扎。我已經讓它作業了,但是有錯誤:
- 文本輸入欄位是預先填充的,單擊它會清除(它的意思是這樣做),但游標沒有出現,我無法在條目中輸入新文本。如果我單擊 tkinter 視窗然后回傳到它,游標會出現,我可以按預期輸入文本
- 頂部的單選按鈕顯示為預先選擇的,但不是。驗證功能說沒有選擇單選按鈕。我可以選擇另一個選項并且它可以作業,但我無法選擇第一個選項,即使我單擊第一個選項然后再回傳它。編輯:這個問題是由我的驗證函式引起的,它丟棄了 0 值,即頂部單選按鈕。感謝@acw1668 提供解決此問題的線索。我現在將起始值設定為 -1(所以沒有選擇任何內容)并且驗證函式檢查 -1
我不知道從這里去哪里。我試過使用e1.focus(),但沒有任何區別。我試過在檔案打開對話框之前運行問題視窗,但這真的很困惑。我已經嘗試注釋掉清除輸入功能,以防萬一導致問題,但行為基本相同。編輯:我使用 Anaconda 3 中的 Spyder 作為我的 IDE,我想知道這是否會導致問題 1,因為 @acw1668 無法復制它。
這是我的代碼:
root=tk.Tk()
csvfp=tk.filedialog.askopenfilename()
SName, ProgSel=ask_multiple_choice_question(root, LPrograms)
def ask_multiple_choice_question(root, options):
#https://stackoverflow.com/questions/42581016/how-do-i-display-a-dialog-that-asks-the-user-multi-choice-question-using-tkinter
#Define a function to clear the contents of the textbox when it is clicked
def click(event):
e1.configure(state=tk.NORMAL)
e1.delete(0,tk.END)
e1.unbind('<Button-1>',clicked)
#checks entries are valid when submit button is clicked, then closes window
def validate():
if v.get() == 0 or v2.get() == "" or v2.get()==starttext:
return None
root.destroy()
frame1=Frame(root)
frame1.pack(padx=20,pady=10)
frame2=Frame(root)
frame2.pack()
frame3=Frame(root)
frame3.pack(pady=10)
Label(frame1, text="Student name?").pack()
v2=tk.StringVar()
e1 = Entry(frame1, width=30, textvariable=v2)
starttext="Surname, Firstname (ID)"
e1.insert(0, starttext)
e1.pack()
#bind e1 with mouse button to clear contents on click
clicked=e1.bind('<Button-1>',click)
Label(frame2, text="Program?").pack()
v = IntVar()
for i, option in enumerate(options):
Radiobutton(frame2, text=option, variable=v, value=i).pack(anchor="w")
Button(frame3, text="Submit", command=validate).pack()
root.mainloop()
return v2.get(), options[v.get()]
感謝您提供任何線索!
uj5u.com熱心網友回復:
對于問題 #1,您需要在主視窗準備好并可見后顯示檔案對話框。您可以root.wait_visibility()在以下時間致電root = tk.Tk():
...
root = tk.Tk()
root.wait_visibility()
...
對于問題 #2,由于value第一個單選按鈕的選項為 0,并且其 tkinter 變數的初始值v默認為 0,因此將選擇第一個單選按鈕。將初始值設定v為 -1 將修復它:
...
def validate():
# check -1 instead of 0
if v.get() == -1 or v2.get() == "" or v2.get() == starttext:
return None
root.destroy()
...
v = tk.IntVar(value=-1)
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/419302.html
標籤:
