2012-09-20 47 views
3

我的程序應檢查輸入單詞的前三個字母是否與預定義的單詞相似。
我用Tkinter製作了一個圖形用戶界面,並希望獲得輸入字段的字母。
不知怎的,我不能像在沒有Tkinter的情況下實現它。Tkinter輸入的第一個字母

這就是我要做的事只是外殼:

text = raw_input('Enter a word: ') 

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

所以,當我輸入單詞「sagst」它檢查的前三個字母,並應推出「薩根」。工作正常。

我瞭解到,例如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技能不好);-)
謝謝!

+4

提示:切片對字符串很有效:'text [:3] =='sag''。更好的是,python字符串有一個'.startswith()'函數:'text.startswith('sag')'。 –

+0

當你說它「不起作用」時,你是什麼意思,它做錯了什麼? *此外,您可以切分文本:'text [0:3]'與text [0] + text [1] + text [2]'相同。* –

回答

3

check功能就必須獲取後的按鈕被按下的文本框

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

我已經改變了你的一個小測試,使用.startswith(),並直接打印該測試的結果(打印將把布爾型TrueFalse轉換爲匹配字符串)。

在你的代碼會發生什麼事是你定義inputfield,檢索它的內容(顯然是空的),只有然後顯示運行的主循環的Tkinter的GUI窗口。用戶從來沒有機會以這種方式輸入任何文本。

+0

非常感謝!完美的作品。 :) – Leo

0

實際上並沒有將輸入字段中的值放入文本變量中。

我將文本中的值重命名爲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價值。

+0

'text'作爲變量沒有任何問題名字實際上。它至少不會影響任何內置函數或類型。 –

+0

我想你是對的。 – jgritty

2

您還可以檢查此,而不需要一個按鈕(現在它會檢查每當用戶按下「回車」):

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。 (鏈接是舊的,但它也指向新功能,允許您在不進行子類化的情況下執行此操作)。

0

這是一個使用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() 
相關問題