2017-04-09 33 views
0

現在、私はPython 3.6 Tkinterを使ってプロジェクトを進めています。現時点では、私は "User"または "Admin"のいずれかを入れるためのユーザアクセス権OptionMenuを作ろうとしています。私はいろいろな方法を試しましたが、それを自分で修正するか、オンラインで参考になる資料を見つけることはできません。 問題はOptionMenuを作成して表示することではなく、StringVar変数の値が変更されていないことです。問題は、新しいオプションが選択されても、OptionMenu内のテキストが変更されていないことです。Tkinter 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 

This is the output of the code

私は(私が思う)必要なすべてのライブラリの輸入を持っている:

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

誰もが、それははるかに高く評価されるだろう、この仕事を作る方法を作業することができます。 ありがとう

答えて

1

私はあなたのコードを試してみて、それは私のために働く。私はガベージコレクションの問題だと推測できます。オプションメニューを自分ではなくフレームに割り当てて、上書きされないようにしてください。

フレームをサブクラス化してユーザーインスタンスを作成するように、これを書き直す必要があります。

編集:例えば:

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'を使用しましたが、フレームをサブクラス化したので、 "self"は今度はFrameインスタンスを参照します。言い換えれば、私が上記の "frame.options"を使用したブロックと同じです。

+0

@Jonathonユーザー数が決まっていないので(ファイルから取得してその情報を使用して2D配列を生成するので)、ユーザーごとにフレームを作成してノートブックウィジェットは、各ユーザーのフレームを生成し、配列内の各ユーザーを反復するメソッドを作成することでした。あなたが言ったことを何かできることがあれば、それは大いに感謝されます –

+0

私は私の答えを例で編集しました。 – Novel

+0

@ジョナトンオハイオ州右私は前の完全な例を見ていませんでした(私はばかだから!)、いくつかの微妙な変更(またはあなたがするならtkintering)の後、私は最終的にあなたのコードで動作した。これまでずっとありがとう –

関連する問題