• 締切済み

tkinterのコンボボックスとラベルの連携表示

以下のサイトを参考に、Pythonのtkinterを用いて簡単なGUIを作成しています。 https://office54.net/python/tkinter/ttk-combobox-widget https://toolmania.info/post-12996/ 現在、コンボボックスとラベルの連携表示において、上手く想定通りの挙動を示さず困っております。 下記のコードにおいて、 「combobox」の値(クリックして選択)を変更した際に、 label1: list1を反映しているコンボボックスの文字列をそのまま反映、 label2: label1用のウィジェット変数(strvalue_widget)の文字列をlist1から検索して要素番号(インデックス)を取得し、更にlist2から同じ要素番号の数値を反映 という表示を行いたく考えているのですが、 実際にコンボボックスをクリックした際、label2の表示が空白となってしまう状態です。 しかし、確認のためにlabel2用のウィジェット変数(floatvalue_widget)を出力してみる(25行目)と、クリック毎に適切な値が出力されます。 (ウィジェット変数としては正しく認識されているにもかかわらず、表示だけが適切にされないという不可解な状況になっています。) 色々と試行錯誤してみましたが、label2は空白もしくはデフォルト値(0.1)から変わらないだけで、 どうしてもきちんと連動した動きを見せてくれませんでした。 お手数をお掛けして申し訳ありませんが、どなたかお詳しい方がおられましたら、 是非教えていただけますと助かります。 よろしくお願いします。 【以下、問題としているサンプルコード】 import tkinter as tk from tkinter import ttk list1 = ["No.1", "No.2", "No.3", "No.4", "No.5"] list2 = [0.1, 0.2, 0.3, 0.4, 0.5] #rootメインウィンドウの設定 root = tk.Tk() #メインフレームの作成と設置 frame = ttk.Frame(root) frame.grid(column=0, row=0, sticky=tk.NSEW, padx=5, pady=10) strvalue_widget = tk.StringVar(value=list1[0]) floatvalue_widget = tk.DoubleVar(value=list2[0]) label1 = ttk.Label(frame, textvariable=strvalue_widget) label2 = ttk.Label(frame, textvariable=floatvalue_widget) combobox = ttk.Combobox(frame, textvariable=strvalue_widget, values=list1) def combobox_clicked(event): global floatvalue_widget floatvalue_widget = float(list2[list1.index(combobox.get())]) print(f"確認 floatvalue_widget: {floatvalue_widget}") return combobox.bind("<<ComboboxSelected>>", combobox_clicked) #レイアウト label1.grid(row=0, column=0) label2.grid(row=0, column=1) combobox.grid(row=0, column=2) #GUIウィンドウを常駐表示 root.mainloop()

  • Python
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

set と get メソッドを使いましょう。 floatvalue_widget.set(float(list2[list1.index(combobox.get())])) print(f"確認 floatvalue_widget: {floatvalue_widget.get()}")

関連するQ&A

  • VBAのコンボボックスのカラムについて

    以下のようにしてコンボボックスのカラムにも文字列が入るようにしております。 With ComboBox1 .AddItem "hogehoge" ComboBox1.List(0, 1) = "aiueo" End With これによってコンボボックスをクリックして出てくるリストにはhogehogeとaiueoの両方が 出てきますが、これを選択するとhogehogeだけがコンボボックスに残され、 (0,1)にあった文字列は消えてしまいます。 リストから選択した後もコンボボックス内にカラムの文字を残すにはどのようにすればよろしいでしょうか?(できれば区切りありで) よろしくお願いします。

  • Pythonコードの間違いを指摘して

    import tkinter as tk lastplay="" def gamestart(): global lastplay lastplay="試合開始" frame_main.tkraise() root=tk.Tk() frame_settings=tk.Frame(root) frame_settings.grid() button_gamestart=tk.Button(frame_settings,command=gamestart) button_gamestart.grid() fraim_main=tk.Frame(root) fraim_main.grid() label_1=tk.Label(frame_main,text=f"{lastplay}です") label_1.grid() fraim_settings.tkraise() root.mainloop() エラー内容 frame_mainが表示されたとき、変数の「試合開始」が表示されず、「です」のみ表示される。

  • Pythonコードの間違いを指摘して

    import tkinter as tk i=0 def a(): global i i=1 root=tk.TK() root.geometry("100x100") a() label=tk.Label(root,text=i) label.grid() tk.mainloop() →できた import tkinter as tk i=0 def a(): global i i=1 root=tk.TK() root.geometry("100x100") label=tk.Label(root,text=i) label.grid() button=tk.Button(root,text="button",command=a) button.grid() tk.mainloop() →できない(0と表示される)

  • 同じコンボボックス、リストボックスを使うには?

    よろしくお願いします。 今、ユーザーフォームを使って製造計画表を作っています。 コンボボックスで会社名、リストボックスで会社ごとの製品名を選択させるとこまで出来ました。 1日に3つの製品を作ることが出来るので、同じ中身のコンボボックス、リストボックスを使って3つ作りたいと思っています。 ユーザーフォームの形的にはこのような感じですが。 1. コンボボックス  リストボックス 2. コンボボックス  リストボックス 3. コンボボックス  リストボックス 今は、1.のとこだけは出来たのですが、2.3.は1.と同じコードをコピーして必要と思われるとこだけをコンボボックス2と変えたりしてみたのですが、上手くいきませんでした。こんなコードですが。 Private Sub UserForm_initialize() 'ComboBox1セット Dim ico As Long ico = 1 With ThisWorkbook.Worksheets("Sheet1") Do While .Cells(1, ico) <> "" Me.ComboBox1.AddItem .Cells(1, ico).Value ico = ico + 1 Loop End With Me.ComboBox1.SetFocus End Sub Private Sub ComboBox1_Change() 'ListBox1セット Dim ico As Long 'Me.ListBox1.Clear ico = Me.ComboBox1.ListIndex + 1 With ThisWorkbook.Worksheets("Sheet1") Me.ListBox1.List = .Range(.Cells(2, ico), _ .Cells(.Cells(Rows.Count, ico).End(xlUp).Row, ico)).Value End With End Sub VBAも初めたばかりで質問の内容もわかりづらいとも思いますが、よろしくお願いします。

  • エクセルVBAコンボボックスについて

    図の左のように、商品リスト欄のセルA3から下方向に大分類(A16まで14種類) セルB3~O3(Bから数えて14個目のO)列から下方向に小分類があります。 P2~P11には1から10までの数字が入っています。 図の右側がユーザフォームで、コンボボックスの番号を入れています。 コンボボックス「1.4.・・・28.」までは大分類を選べるようにして、 コンボボックス「2.5.・・・29.」までは左の大分類に応じた小分類の値を表示させたいと思っています。 大分類「111」→小分類「あ~そ」 大分類「222」→小分類「た~と」といった具合です。 そのコンボボックスの値を指定したセルに入力しようと思っています。 下のように記述した結果、問題が発生しました。 (1)大分類で14個ほどあるリストの3つほどしかでてこない。 (2)Select Caseの構文を使用していて、大分類が14個だから「Case 13」までと しているが、「大分類の数-1」までの変えられる数までにしたい。 アドバイスをいただけると助かります。 ------------------------------------------------------------------ Private Sub UserForm_Initialize() Dim MyVar1 As Variant MyVar1 = Sheets("商品リスト").Range("A3:A" & Range("A3").End(xlDown).Row) Dim MyVar20 As Variant MyVar20 = Sheets("商品リスト").Range("P2:P" & Range("P2").End(xlDown).Row) '種類欄を指定 With ComboBox1 .List() = MyVar1 End With ※・・・(省略)・・・ コンボボックス4から25まで※ With ComboBox28 .List() = MyVar1 End With '数量欄を指定 With ComboBox3 .List() = MyVar20 End With ※・・・(省略)・・・ コンボボックス6から27まで※ With ComboBox30 .List() = MyVar20 End With End Sub '1番目 Private Sub ComboBox1_Change() Dim MyVar1 As Variant ※・・・(省略)・・・ MyVar2~13 As Variant※ Dim MyVar14 As Variant Dim MyVar20 As Variant MyVar1 = Sheets("商品リスト").Range("A3:A" & Range("A3").End(xlDown).Row) ※・・・(省略)・・・ B列からN列まで※ MyVar15 = Sheets("商品リスト").Range("O3:O" & Range("O3").End(xlDown).Row) MyVar20 = Sheets("商品リスト").Range("P2:P11") Select Case ComboBox1.ListIndex Case 0 With ComboBox2 .List() = MyVar2 End With ※・・・(省略)・・・ Case1~ Case12 ※ Case 13 With ComboBox2 .List() = MyVar15 End With End Select End Sub

  • ExcelVBAコンボボックス選択時の処理

    ExcelVBAで教えて下さい。 ユーザーフォームを作成しているのですがその中の機能の一部で、「コンボボックスを選択した内容に応じてラベルに表示させる」ということをしたいのですがうまくいきません。 コンボボックスにはSheet2の内容を表示するようにさせています。 Private Sub ComboBox_DropButtonClick() Dim i As Integer Dim LastRow As Integer With ComboBox LastRow = Cells(Row.Count, 1).End(xlUp).Row For i = 3 To LastRow .AddItem Worksheets("Sheet2").Cells(i, 1).Value Next i End With End Sub Sheet2の1列目には「2002年_H14」「2003年_H15」という書式で「2012年_H24」まで入力されています。 For i = 3 To LastRow としたのは、コンボボックスから選択した結果をラベルに表示させるとき、選択した年の前後2年を合わせた合計五年間を「2002~2006年」と表示したいためです。 <例> ・コンボボックスで「2004年_H16」選択   ↓ ・ラベルに「2002~2006年」と表示 コンボボックスのChangeコードはコンボボックスに入っている値が数字だったのみしか書けませんでした。 Private Sub ComboBox_Change() Dim i As Integer With ComboBox If .ListIndex = 0 Then i = .List(ListIndex, 0) Label.Caption = (i - 2) & "~" & (i + 2) & "年" End If End With End Sub もしくは Label.Caption = ComboBox.Value - 2 & "~" & ComboBox + 2 & "年" これだと「2002年_H14」というようにコンボボックスに入っていた場合はえらいになってしまい、どうにもなりません。うまくいったとしても「_H14」の取り除き方が分かりません。 実際に実現している画面を見せてもらったのですがコードまでは見てなく、仕組みが分からないのと、作成者不明という感じのものなので聞くに聞けずここに頼った次第です。 ご存じの方いらっしゃいましたらお知恵を拝借したく、何卒よろしくお願い致します。

  • Excelのワークシートでのコンボボックスについて

    Excelのワークシートでコンボボックスを設定する方法を教えてください。 「フォームコントロール」と「ActiveXコントロール」の違いがわかりません。 添付の画像の通りコンボボックスに西暦を入力(別シートに入力済みの値を表示するように設定)してあるのですが、ファイルを保存しているにも関わらず、再度ファイルを開くとコンボボックスの中のリストは空欄になってしまいます。 今は「ActiveXコントロール」のコンボボックスで設定しています。 コードは以下のように設定してみたのですが、設定内容や設定箇所が違うのでしょうか? ////////////////////////////////////////////////////// Private Sub ComboBox1_DropButtonClick() Dim sh As Worksheet Set sh = Worksheets("マクロ") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// コンボボックスのリストの内容が消えてしまうので、 コードの内容は同じで以下のところにもコードを書いてみました。 ////////////////////////////////////////////////////// Private Sub Worksheet_Activate() Dim sh As Worksheet Set sh = Worksheets("マクロ") Dim i As Integer Dim lastRow As Integer lastRow = sh.Cells(Rows.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem sh.Cells(i, 1).Value End If Next i End With End Sub ////////////////////////////////////////////////////// なんだかもう、訳がわからずぐちゃぐちゃです。 コンボボックスの中に値が入っていると、実行ボタンをクリックしたときは正常にやりたい結果を出すことが実現できます。 ファイルを閉じた後に再度開いてもコンボボックスの中に値があるようにするにはどうしたらよいのか、ド素人の私にご教授いただきたくお願いいたします。

  • マクロでコンボボックスのリストの設定について

    マクロを記述しているワークブック内では UserForm.ComboBox1.RowSource = "D2:D" & Range("D65536").End(xlUp).Row とすると希望通りのリストがコンボボックスに入るのですが、 他のワークブックからの参照ができないので教えてください。 C:\Documents and Settings\taro\デスクトップ にあるワークブック(abc.xls)のsheet1のD列をコンボボックスに入れるにはどのように書けばいいですか? 最初に WorkBoooks.open = (ThisWorkbook.path & "\abc.xls") などを記入する必要がありますか? できればワークブックを開けることなく値を参照したいです。 よろしくお願いします。

  • コンボボックス 連動 VBA

    VBA初心者です。 ご教授ください。 入力フォームにコンボボックスを4っつ リストボックスを一つ作成し 一つ目のコンボでシートを選択後 二つ目以降のコンボボックスでセル範囲を選択し絞り込み、最終のリストボックスに 絞り込み表示を行い、コマンドボタンにて フィルター操作を行いたいのですが 重複表示させずに、絞り込んでいく方法がうまくいきません。下記コードにコンボボックス3以降も記述したのですが、絞り込みができません。よろしくお願いします。 Private Sub UserForm_Initialize() For i = 2 To Worksheets.Count 'シートの数だけ繰り返す ComboBox1.AddItem Worksheets(i).Name '取得したシート名をリストボックスへ Next End Sub Private Sub ComboBox1_Change() Dim Index As Integer Dim strBuf As String Index = ComboBox1.ListIndex 'ワークシートリストの選択された位置 strBuf = ComboBox1.List(Index) 'ワークシート名を取得 Worksheets(strBuf).Activate ' セルA1を左上端にする Application.Goto Reference:=Range("A1"), Scroll:=True ComboBox2.Clear Dim リスト As New Collection Dim 列 As String, 上端セル As String, 最下端セル As String Dim セル範囲 As Range, 各セル As Range 列 = "b" '※3 上端セル = 列 & "4" '※4 最下端セル = 列 & "65536" With Worksheets(strBuf) '※5 Set セル範囲 = .Range(.Range(上端セル), .Range(最下端セル).End(xlUp)) End With For Each 各セル In セル範囲 'セル範囲の各セルについて繰り返し処理 On Error Resume Next '次行が実行時エラーならその次行から継続 リスト.Add 各セル.Value, CStr(各セル.Value) 'Collectionオブジェクトにメンバを追加 If Err.Number = 0 Then '実行時エラーが発生していなければ Me.ComboBox2.AddItem 各セル.Value 'コンボボックスのリストに項目を追加 End If On Error GoTo 0 Next End Sub

  • DataGridViewのコンボボックスについて

    DataGridViewのコンボボックスにおける初期インデックス値設定について  会社の用度管理に関するソフトを個人で作成しています。DataGridViewのコンボボックス でかなり悩んでおり、どなたか解決できる方がおられましたらご教示願います。 DataGridViewにてコンボボックスを「列の編集」時点で 作成し(columnType:DataGridViewComboBoxColumn)プログラム 段階で選択項目の準備をしています・・・・ --選択項目の準備------------------------------------------------ ※DataGridView名:GMN物品発注明細表 ※column名:処理選択 Dim column As New DataGridViewComboBoxColumn() 'ComboBoxのリストに表示する項目を指定 column.Items.Add("発 注") column.Items.Add("未発中") column.Items.Add("発注済") '"処理選択"列にバインドされているデータを表示 column.DataPropertyName = "処理選択" '"処理選択k"列の代わりにComboBox列を表示する GMN物品発注明細表.Columns.Insert(GMN物品発注明細表.Columns("処理選択").Index, column) GMN物品発注明細表.Columns.Remove("処理選択") column.Name = "処理選択" ------------------------------------------------------------------ ここまではいいのですが、表にデータを一行づつ挿入する際に「選択項目の準備」 にて作成したリストを行ごとに"発 注"・"未発中"・"発注済"の何れかを選択して 表示していきたいのです。行の挿入には --行の挿入処理------------------------------------------------------- ’行の挿入 GMN物品発注明細表.Rows.Add(New Object() {?,"1","2",・・・・・}) -------------------------------------------------------------------  「?」に何を指定すれば"発 注"・"未発中"・"発注済"の何れかを表示できるようになるか? お教え願えないでしょうか? GMN物品発注明細表.Rows.Add(New Object() {?,"1","2",・・・・・})の下に 「GMN物品発注明細表.Item(0, iRowCount).Value = "未発中"」 とかを追加してやると、Value値は"未発中"になりますが、表示されていない状況です。さらに インデックス値が分かるといいのですが。 ↓赤丸に初めから"発 注"・"未発中"・"発注済"の何れかを表示したいのですが・・・ 開発環境 Windows7/Xp等      VisualStudio2010