2016-11-06 1 views
0

Я довольно новичок в python, и в настоящее время я работаю над школьным проектом, моя цель - создать панель поиска, которая может использоваться для поиска файла данных, однако я изо всех сил пытаюсь чтобы панель поиска работала правильно. Я использую виджет ввода tkinter. Когда я вызываю .get(), строка в виджетах записи не печатается. Вот мой код ...Виджет ввода Tkinter .get не работает

from tkinter import * 

def searchButton(): 
     text = searched.get() 
     print (text) 

def drawStatWindow(): 
    global searched 
    statWindow = Tk() 
    statWindow.title("View Statistics") 
    statWindow.config(bg = "grey") 
    statWindow.geometry('800x900') 

    searched = StringVar() 
    searchBox = Entry(statWindow, textvariable = searched) 
    searchBox.place(x= 450, y=50, width = 200, height = 24) 
    enterButton = tkinter.Button(statWindow, text ="Enter", command =searchButton) 
    enterButton.config(height = 1, width = 4) 
    enterButton.place(x=652, y=50) 

drawStatWindow() 

Когда я ввожу строку в виджет ввода и нажимаю кнопку ввода, ничего не происходит. Как я уже сказал, я не очень опытен, и это мой первый проект, но после прочтения виджета ввода tkinter я не понимаю, почему это не сработает. Я использую python V3.4.0 Спасибо.

+0

Код в вашем вопросе не будет работать. Пожалуйста, найдите время, чтобы отправить _actual_ код, который иллюстрирует проблему. –

ответ

0

Ваш код не звонит mainloop(). Вы можете попробовать добавить его в конец функции drawStatWindow():

statWindow.mainloop() 

Вы можете перестроить свой код в класс. Это позволяет избежать использования глобальных переменных и в целом обеспечивает лучшую организацию для приложения:

from tkinter import * 

class App: 
    def __init__(self, statWindow): 
     statWindow.title("View Statistics") 
     statWindow.config(bg = "grey") 
     statWindow.geometry('800x900') 

     self.searched = StringVar() 
     searchBox = Entry(statWindow, textvariable=self.searched) 
     searchBox.place(x= 450, y=50, width = 200, height = 24) 
     enterButton = Button(statWindow, text ="Enter", command=self.searchButton) 
     enterButton.config(height = 1, width = 4) 
     enterButton.place(x=652, y=50) 

    def searchButton(self): 
     text = self.searched.get() 
     print(text) 


root = Tk() 
app = App(root) 
root.mainloop() 
+0

Большое спасибо, я хотел бы перестроить свой код, как это, но я никогда не использовал классы раньше, так что это дает мне хорошую отправную точку. Я рассмотрю это больше и попытаюсь перестроить всю свою программу, как это. –

-2

Нет необходимости использовать textvariable, вы должны использовать это:

searchBox = Entry(statWindow) 
searchBox.focus_set() 
searchBox.place(x= 450, y=50, width = 200, height = 24) 

тогда вы будете иметь возможность использовать SearchBox .get(), это будет строка.

+0

Спасибо, что работает отлично! Просто из интереса, что делает focus_set()? –

+0

Он возвращает строку, записанную в записи, я не знаю, что лучше. – Karak

+1

Нет, 'focus_set()' does _not_ "возвращает строку, записанную в записи". Как следует из названия, он просто устанавливает фокус в запись. Он не влияет на результат 'searchBox.get()'. –

0

Вы должны добавить mainloop(), потому что tkinter нуждается в нем для запуска.

Если вы запустили код в IDLE, который использует tkinter, тогда IDLE запускает собственный mainloop(), и код может работать, но обычно вы должны добавить mainloop() в конце.

И вы должны удалить tkinter в tkinter.Button.

from tkinter import * 

def searchButton(): 
    text = searched.get() 
    print(text) 

def drawStatWindow(): 
    global searched 

    statWindow = Tk() 
    statWindow.title("View Statistics") 
    statWindow.config(bg="grey") 
    statWindow.geometry('800x900') 

    searched = StringVar() 

    searchBox = Entry(statWindow, textvariable=searched) 
    searchBox.place(x= 450, y=50, width=200, height=24) 

    # remove `tkinter` in `tkinter.Button` 
    enterButton = Button(statWindow, text="Enter", command=searchButton) 
    enterButton.config(height=1, width=4) 
    enterButton.place(x=652, y=50) 

    # add `mainloop()` 
    statWindow.mainloop() 

drawStatWindow()