3

私のプログラムは、入力された単語の最初の3文字が事前定義された単語に類似しているかどうかをチェックする必要があります。
TkinterでGUIを作成しましたが、入力フィールドの文字を取得したいと思います。
どういうわけか、Tkinterなしで行うようにそれを実装することはできません。

それは私がシェルのためだけにそれをする方法です:

text = raw_input('Enter a word: ')

if (text[0] + text[1] + text[2] == 'sag'):
    print "sagen"
else:
    print "error"

したがって、「sagst」という単語を入力すると、最初の3文字がチェックされ、「sagen」が出力されます。正常に動作します。

inputfield.get()たとえば、エントリ「inputfield」の入力を取得することを学びました。
しかし、どうすればその「入力フィールド」の最初の文字を確認できますか?
小さな選択:

from Tkinter import*
root = Tk()

def check():
    if (text[0] + text[1] + text[2] == 'sag'):
        print "True"
    else:
        print "False"

inputfield = Entry(root)
inputfield.pack()

but = Button(root,text='Check!', command = check)
but.pack()

text = inputfield.get()

root.mainloop()

動作しません...

あなたが私の質問を理解して、すぐに答えてくれることを願っています。(私の悪い英語と私の悪いPythonスキルをお詫びします);-)
ありがとう!

4

4 に答える 4

3

ボタンが押されたcheck、関数はテキストフィールドを取得する必要があります。

def check():
    text = inputfield.get()
    print text.startswith('sag')

を使用してテストを少し変更し、.startswith()そのテストの結果を直接印刷しました(printはブール値TrueまたはFalse一致する文字列に変換されます)。

コードで何が起こるかというと、定義しinputfield、その内容(明らかに空)を取得してから、メインループを実行してTKInterGUIウィンドウを表示するだけです。ユーザーがそのようにテキストを入力する機会は決してありません。

于 2012-09-20T16:56:30.303 に答える
2

ボタンを使わなくてもこれを確認できます(ユーザーが「Enter」を押すたびに確認できるようになりました)。

from Tkinter import *
root = Tk()
def check(*event):
    text = inputfield.get()
    print text.startswith('sag')

inputfield = Entry(root)
inputfield.bind('<Return>',check)
inputfield.pack()
root.mainloop()

入力時にウィジェットにエントリを検証させるために、他のことを行うこともできます。(リンクは古いですが、サブクラス化せずにこれを実行できる新しい機能も示しています)。

于 2012-09-20T17:03:31.977 に答える
0

入力フィールドの値を実際にテキスト変数に入力しているわけではありません。

混乱したため、値の名前をtextからinput_textに変更しました。text[0] + text[1] + text[2]また、使用から使用に変更しましたstartswith()。これにより、短い文字列でIndexErrorsが発生するのを防ぐことができ、よりPython的です。

from Tkinter import*
root = Tk()

def check():
    input_text = inputfield.get()
    if input_text.startswith('sag'):
        print "True"
    else:
        print "False"

inputfield = Entry(root)
inputfield.pack()



input_text = inputfield.get()
print input_text # Note that this never prints a string, because it only prints once when the input is empty.

but = Button(root, text='Check!', command=check)
but.pack()

root.mainloop()

重要な変更は、check関数が実際にの値を取得する必要があることinputfieldです。

于 2012-09-20T16:55:58.217 に答える
0

これは、ユーザーが入力したときにコンテンツを検証するエントリウィジェットを使用するバージョンです(したがって、ユーザーはボタンをクリックしたり、Returnキーを押したりする必要はありません)。

import Tkinter as tk
class MyApp(object):
    '''
    http://effbot.org/zone/tkinter-entry-validate.htm
    http://effbot.org/tkinterbook/entry.htm
    http://www.tcl.tk/man/tcl8.5/TkCmd/entry.htm#M-validate
    '''
    def __init__(self, master):
        vcmd = (master.register(self.validate),
                '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
        self.entry = tk.Entry(master, validate = 'key',
                              validatecommand = vcmd)
        self.entry.pack()
        self.entry.focus()

    def validate(self, action, index, value_if_allowed,
                   prior_value, text, validation_type, trigger_type, widget_name):
        dtype = {'0':'delete', '1':'insert', '-1':'other'}[action]
        n = min(3, len(value_if_allowed))
        valid = False
        if dtype == 'insert':
            if value_if_allowed[:n] == 'sag'[:n]: valid = True
            else: valid = False
        else: valid = True
        print(valid)
        return True

root = tk.Tk()
app = MyApp(root)
root.mainloop()
于 2012-09-20T17:18:42.370 に答える