3

我的程序应该检查输入单词的前三个字母是否与预定义的单词相似。
我已经用 Tkinter 制作了一个 GUI,并且想要获取输入字段的字母。
不知何故,我无法像没有 Tkinter 那样实现它。

这就是我为外壳做的事情:

text = raw_input('Enter a word: ')

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

所以,当我输入“sagst”这个词时,它会检查前三个字母并应该输出“sagst”。工作正常。

我了解到例如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()并直接打印该测试的结果(打印将变成布尔值TrueFalse匹配的字符串)。

在您的代码中发生的是您定义inputfield、检索它的内容(显然是空的),然后才通过运行 mainloop 来显示 TKInter GUI 窗口。用户永远没有机会以这种方式输入任何文本。

于 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

Here is a version which uses an Entry widget which validates its contents as the user types (so the user does not have to click a button or even press 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 回答
0

您实际上并没有将输入字段中的值放入文本变量中。

我将值从 text 重命名为 input_text 因为它让我感到困惑。我也从 usingtext[0] + text[1] + text[2]改为 using startswith()。这将防止您在短字符串上获得 IndexErrors,并且更加pythonic。

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 回答