簡體   English   中英

Tkinter OptionMenu小部件未顯示值

[英]Tkinter OptionMenu widget is not displaying values

目前,我正在使用Python 3.6 Tkinter進行項目。 目前,我正在嘗試為用戶提供OptionOption的訪問權限,使其放置“ User”或“ Admin”。 我嘗試了各種方法,但似乎無法自己修復或在線找到有用的文檔。 問題不在於制作OptionMenu並顯示它,也不在於StringVar變量的值沒有改變。 問題在於,當選擇任何新選項時,OptionMenu內的文本不會更改。

class UsersDetailsEditPage(Tk):
def __init__(self, *args, **kwargs):
    Tk.__init__(self, *args, **kwargs)
    self.title("Edit User Details")
    self.option_add("*Font", 'TkDefaultFont')

    self.noteBook = ttk.Notebook(self)

    for i in range(len(users)):
        self.noteBook.add(self.getUserViewFrame(users[i]), text=users[i][2])
    self.noteBook.pack()

    self.resizable(width=False, height=False)

def getUserViewFrame(self, user):
    frame = Frame(self)
    frame.grid_rowconfigure(1, weight=1)
    frame.grid_columnconfigure(1, weight=1)

    Label(frame, text="User's name:").grid(row=0, column=0, sticky=W)
    nameText = Text(frame, height=1, width=20)
    nameText.insert("1.0", user[2])
    nameText.edit_reset()
    nameText.grid(row=0, column=1, sticky=E)

    Label(frame, text="Username:").grid(row=1, column=0, sticky=W)
    usernameText = Text(frame, height=1, width=20)
    usernameText.insert("1.0", user[0])
    usernameText.edit_reset()
    usernameText.grid(row=1, column=1, sticky=E)

    Label(frame, text="Password:").grid(row=2, column=0, sticky=W)
    passwordText = Text(frame, height=1, width=20)
    passwordText.insert("1.0", user[1])
    passwordText.edit_reset()
    passwordText.grid(row=2, column=1, sticky=E)

    # the constructor syntax is:
    # OptionMenu(master, variable, *values)

    Label(frame, text="User Access:").grid(row=3, column=0, sticky=W)
    self.options = StringVar()
    self.options.set("User")

    self.userAccessDrop = ttk.OptionMenu(frame, self.options, "User", *("User", "Admin"))
    self.userAccessDrop.config(width=10)
    self.userAccessDrop.grid(row=3, column=1, sticky=E)

    return frame

這是代碼的輸出

我有所有需要的庫導入(我認為):

from tkinter import *
from tkinter import messagebox
import tkinter.ttk as ttk
import csv
import os

如果有人能解決如何完成這項工作,將不勝感激。 謝謝

我嘗試了您的代碼,它對我有用。 我只能猜測這是垃圾回收問題。 嘗試將選項菜單分配給邊框而不是邊框​​,這樣就不會被覆蓋。

frame.options = StringVar()
frame.options.set("User")

frame.userAccessDrop = ttk.OptionMenu(frame, frame.options, "User", *("User", "Admin"))
frame.userAccessDrop.config(width=10)
frame.userAccessDrop.grid(row=3, column=1, sticky=E)

您確實應該重寫此代碼,以便子類化Frame來制作用戶實例。

編輯:例如:

import tkinter as tk
from tkinter import ttk

class UserFrame(tk.Frame):
    def __init__(self, master=None, data=None, **kwargs):
        tk.Frame.__init__(self, master, **kwargs)

        data = data[2], data[0], data[1] # rearrange data
        labels = ("User's name:", "Username:", "Password:")
        for row, (label, value) in enumerate(zip(labels, data)):
            lbl = tk.Label(self, text=label)
            lbl.grid(row=row, column=0, sticky=tk.W)
            ent = tk.Entry(self)
            ent.insert(0, value)
            ent.grid(row=row, column=1, sticky=tk.E)

        lbl = tk.Label(self, text="User Access:")
        lbl.grid(row=3, column=0, sticky=tk.W)
        self.options = tk.StringVar(self, "User")

        self.userAccessDrop = ttk.OptionMenu(self,
            self.options,
            "User", # starting value
            "User", "Admin", # options
            )
        self.userAccessDrop.config(width=10)
        self.userAccessDrop.grid(row=len(labels), column=1, sticky=tk.E)

class UsersDetailsEditPage(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title("Edit User Details")
        self.option_add("*Font", 'TkDefaultFont')

        self.noteBook = ttk.Notebook(self)

        for user in users:
            self.noteBook.add(UserFrame(self, user), text=user[2])
        self.noteBook.pack()

        self.resizable(width=False, height=False)

實際上,它在功能上與您所擁有的並沒有什么不同,只是代碼更整潔(實際上在編碼時間上有很大的不同)。 注意,我還擺脫了邪惡的通配符導入,並簡化了您的代碼。 請記住,如果要復制和粘貼代碼塊,則是在執行計算機的工作。 我也將您移到了Entry小部件,它們是單行的Text小部件。 此外,請嘗試避免在同一行上初始化窗口小部件並將其布置在“方便”位置。 這很丑陋,並且會導致錯誤。

我在“ self.options”和“ self.userAccessDrop”中使用了“ self”,但是由於我們將Frame子類化,因此“ self”現在是指Frame實例。 換句話說,這與我上面使用“ frame.options”的代碼塊相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM