【问题标题】:First letters of a Tkinter inputTkinter 输入的第一个字母
【发布时间】:2012-09-13 02:05:54
【问题描述】:

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

这就是我为 shell 做的:

text = raw_input('Enter a word: ')

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

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

我了解到,例如inputfield.get() 获取条目“inputfield”的输入。
但是如何检查该“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 技能不好);-)
谢谢!

【问题讨论】:

  • 提示:切片在字符串上效果很好:text[:3] == 'sag'。更好的是,python 字符串有一个.startswith() 函数:text.startswith('sag')
  • 你说它“不起作用”是什么意思,它做错了什么? 此外,您可以对文本进行切片:text[0:3],与 text[0] + text[1] + text[2] 相同。

标签: python input tkinter


【解决方案1】:

您的check 函数必须在按下按钮后检索文本字段:

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

我对你的测试稍作改动,使用.startswith(),并直接打印该测试的结果(打印会将布尔值TrueFalse 转换为匹配字符串)。

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

【讨论】:

  • 非常感谢!!完美运行。 :)
【解决方案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()

您还可以做其他事情来让您的小部件validate the entry as you type。 (该链接是旧的,但它也指向允许您在不进行子类化的情况下执行此操作的新功能。

【讨论】:

    【解决方案3】:

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

    我将值从 text 重命名为 input_text 因为它让我感到困惑。我也从使用text[0] + text[1] + text[2] 更改为使用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中的值。

    【讨论】:

    • 实际上将text 作为变量名并没有错。至少它不会影响任何内置函数或类型。
    【解决方案4】:

    这是一个使用 Entry 小部件的版本,该小部件在用户键入时验证其内容(因此用户不必单击按钮甚至按下 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 2022-11-04
      • 1970-01-01
      相关资源
      最近更新 更多