web-dev-qa-db-ja.com

tkinterのボタンを使用して `Entry`ウィジェットのテキスト/値/コンテンツを設定する方法

Entryモジュールを使用してGUIのボタンを使用して、tkinterウィジェットのテキストを設定しようとしています。

このGUIは、数千の単語を5つのカテゴリに分類するのに役立ちます。各カテゴリにはボタンがあります。ボタンを使用することで大幅にスピードアップすることを望んでいたので、毎回単語をダブルチェックしたい場合は、ボタンを使用してGUIで現在のWordを処理し、次のWordを表示します。

何らかの理由でコマンドボタンが期待どおりに動作しません。これは一例です:

win = Tk()

v = StringVar()
def setText(Word):
    v.set(Word)

a = Button(win, text="plant", command=setText("plant")
a.pack()
b = Button(win, text="animal", command=setText("animal"))
b.pack()
c = Entry(win, textvariable=v)
c.pack()
win.mainloop()

これまでのところ、コンパイルできる場合、クリックは何もしません。

15
unlockme

insertメソッドを使用することもできます。

このスクリプトは、Entryにテキストを挿入します。挿入されたテキストは、ボタンのcommandパラメーターで変更できます。

from tkinter import *

def set_text(text):
    e.delete(0,END)
    e.insert(0,text)
    return

win = Tk()

e = Entry(win,width=10)
e.pack()

b1 = Button(win,text="animal",command=lambda:set_text("animal"))
b1.pack()

b2 = Button(win,text="plant",command=lambda:set_text("plant"))
b2.pack()

win.mainloop()
47
Milan Skála

「テキスト変数」tk.StringVar()を使用する場合、set()することができます。

エントリの削除と挿入を使用する必要はありません。さらに、これらの機能は、エントリが無効または読み取り専用の場合は機能しません!ただし、テキスト変数メソッドは、これらの条件下でも機能します。

import Tkinter as tk

...

entryText = tk.StringVar()
entry = tk.Entry( master, textvariable=entryText )
entryText.set( "Hello World" )
10
BuvinJ

次の2つの方法から選択して、Entryウィジェットのテキストを設定できます。例では、インポートされたライブラリ_import tkinter as tk_およびルートウィンドウroot = tk.Tk()を想定しています。


  • 方法A:deleteおよびinsertを使用

    ウィジェットEntryは、テキストを新しい値に設定するために使用できるメソッドdeleteおよびinsertを提供します。まず、Entryから以前の古いテキストを削除する必要があります。deleteには、削除を開始および終了する位置が必要です。古いテキスト全体を削除するため、_0_で開始し、現在の終了位置で終了します。 ENDを介してその値にアクセスできます。その後、Entryは空になり、_new_text_を_0_の位置に挿入できます。

    _entry = tk.Entry(root)
    new_text = "Example text"
    entry.delete(0, tk.END)
    entry.insert(0, new_text)
    _

  • 方法B:StringVarを使用

    この例では、_entry_text_という新しいStringVarオブジェクトを作成する必要があります。また、Entryウィジェットは、キーワード引数textvariableを使用して作成する必要があります。その後、setで_entry_text_を変更するたびに、Entryウィジェットにテキストが自動的に表示されます。

    _entry_text = tk.StringVar()
    entry = tk.Entry(root, textvariable=entry_text)
    new_text = "Example text"
    entry_text.set(new_text)
    _

  • Buttonを介してテキストを設定する両方の方法を含む完全な作業例

    このウィンドウ

    screenshot

    次の完全な動作例によって生成されます。

    _import tkinter as tk
    
    def button_1_click():
        # define new text (you can modify this to your needs!)
        new_text = "Button 1 clicked!"
        # delete content from position 0 to end
        entry.delete(0, tk.END)
        # insert new_text at position 0
        entry.insert(0, new_text)
    
    def button_2_click():
        # define new text (you can modify this to your needs!)
        new_text = "Button 2 clicked!"
        # set connected text variable to new_text
        entry_text.set(new_text)
    
    root = tk.Tk()
    
    entry_text = tk.StringVar()
    entry = tk.Entry(root, textvariable=entry_text)
    
    button_1 = tk.Button(root, text="Button 1", command=button_1_click)
    button_2 = tk.Button(root, text="Button 2", command=button_2_click)
    
    entry.pack(side=tk.TOP)
    button_1.pack(side=tk.LEFT)
    button_2.pack(side=tk.LEFT)
    
    root.mainloop()
    _
5
finefoot

1つの方法は、新しいクラスEntryWithSetを継承し、 set および deleteを使用するinsertメソッドを定義することです。Entry クラスオブジェクトのメソッド:

try:                        # In order to be able to import tkinter for
    import tkinter as tk    # either in python 2 or in python 3
except ImportError:
    import Tkinter as tk


class EntryWithSet(tk.Entry):
    """
    A subclass to Entry that has a set method for setting its text to
    a given string, much like a Variable class.
    """

    def __init__(self, master, *args, **kwargs):
        tk.Entry.__init__(self, master, *args, **kwargs)


    def set(self, text_string):
        """
        Sets the object's text to text_string.
        """

        self.delete('0', 'end')
        self.insert('0', text_string)


def on_button_click():
    import random, string
    Rand_str = ''.join(random.choice(string.ascii_letters) for _ in range(19))
    entry.set(Rand_str)


if __name__ == '__main__':
    root = tk.Tk()
    entry = EntryWithSet(root)
    entry.pack()
    tk.Button(root, text="Set", command=on_button_click).pack()
    tk.mainloop()
1
Nae
e= StringVar()
def fileDialog():
    filename = filedialog.askopenfilename(initialdir = "/",title = "Select A 
    File",filetype = (("jpeg","*.jpg"),("png","*.png"),("All Files","*.*")))
    e.set(filename)
la = Entry(self,textvariable = e,width = 30).place(x=230,y=330)
butt=Button(self,text="Browse",width=7,command=fileDialog).place(x=430,y=328)
1
Kishore Sharma

あなたの問題は、これを行うときです:

_a = Button(win, text="plant", command=setText("plant"))
_

コマンドに設定する内容を評価しようとします。したがって、Buttonオブジェクトをインスタンス化するとき、実際にsetText("plant")を呼び出します。 setTextメソッドをまだ呼び出したくないので、これは間違っています。次に、この呼び出しの戻り値(None)を取り、それをボタンのコマンドに設定します。ボタンが設定されていないため、ボタンをクリックしても何も起こりません。

MilanSkálaが提案したように、代わりにラムダ式を使用すると、コードが機能します(インデントと括弧を修正すると仮定します)。

実際にcalls関数であるcommand=setText("plant")の代わりに、後で関数を呼び出したいときに呼び出す関数を指定するcommand=lambda:setText("plant")を設定できます。

ラムダが気に入らない場合、別の(少し面倒な)方法は、希望することを行う関数のペアを定義することです。

_def set_to_plant():
    set_text("plant")
def set_to_animal():
    set_text("animal")
_

_command=set_to_plant_と_command=set_to_animal_を使用できます-これらは対応する関数に評価されますが、間違いなくnotcommand=set_to_plant()と同じです。再びNoneに評価します。

0
user9913277