2017-01-11 3 views
0

Я новый им Python, только начал изучать класс и tkinter, так что простите мне «грязный» код. Я пытаюсь ввести некоторую строку в поле NR1, и после того, как нажать на кнопку, распечатайте эту строку в консоли и сохранить это значение для последующего использования:python pass variable tkinter

from tkinter import Tk, BOTH, RIGHT, RAISED, BOTTOM, TOP, X, StringVar 
from tkinter.ttk import Frame, Button, Entry 


class AD(Frame): 
    def __init__(self, parent): 
     Frame.__init__(self, parent, v=None, raw_input=None) 
     self.parent = parent 
     self.parent.geometry("250x150+300+300") 
     self.parent.title("Trolollo") 
     self.parent.resizable(False, False) 
     self.inp = None 
     self.v = StringVar() 
     self.raw_input = None 

     self.initUI() 

    def user_input(self): 
     global inp 
     a = self.raw_input(self.v.get()) 
     inp = a 
     return inp 


    def initUI(self): 
     self.pack(fill=BOTH, expand=True) 

     frame = Frame(self, relief=RAISED, borderwidth=0) 
     frame.pack(fill=BOTH, expand=True) 

     self.entry1 = Entry(frame, textvariable=self.v) 
     self.entry1.pack(side=TOP, fill=X, expand=False, padx=2, pady=2) 
     self.entry1.focus_set() 

     rename_button = Button(frame, text="Dispaly text", command =   self.user_input()) 
     rename_button.pack(side=TOP, expand=False, padx=2, pady=2) 

     entry2 = Entry(frame) 
     entry2.pack(side=TOP, fill=X, expand=False, padx=2, pady=2) 


     quit_button = Button(self, text="Quit", command=self.quit) 
     quit_button.pack(side=RIGHT, padx=5, pady=5) 

     ok_button = Button(self, text="OK") 
     ok_button.pack(side=RIGHT, padx=5, pady=5) 


def main(): 
    root = Tk() 


    app = AD(root) 
    root.mainloop() 


if __name__ == '__main__': 
    main() 

После выполнения кода, я получаю: TypeError: «NoneType 'объект не вызываемая

Любая помощь будет мне оценили

+2

Короче говоря, 'command = self.user_input()' удаляет скобки. – Lafexlos

+1

'raw_input' -' None', и вы пытаетесь вызвать его, используя скобки в строке 'a = self.'. Не знаю, чего вы пытаетесь достичь. – Lafexlos

+0

Используете ли вы python 2 или 3? Вы вызываете 'raw_input()', который является python 2, но вы импортируете 'tkinter', а не' Tkinter', что подразумевает python 3. Затем вы отметили вопрос python-3.5 – tburrows13

ответ

1

ВОПРОСЫ:

  1. Первый вопрос заложен в ваш параметр rename_button's "command = self.user_input()". Вы предполагали назвать функцию и не выполнять функцию. Помещение символа() означало, что вы выполнили функцию, когда ваш код загружен, то есть он выполняется один раз без нажатия кнопки rename.
  2. Вторая проблема была ошибочным кодом в вашей функции user_input. Это вызвало вашу ошибку msg.

ОТВЕТ: Код с предлагаемыми исправлениями.

from tkinter import * 
from tkinter.ttk import * 


class AD(Frame): 
    def __init__(self, parent): 
     Frame.__init__(self, parent, v=None, raw_input=None) 
     self.parent = parent 
     self.parent.geometry("250x150+300+300") 
     self.parent.title("Trolollo") 
     self.parent.resizable(False, False) 
     self.inp = None 
     self.v = StringVar() 
     self.raw_input = None 

     self.initUI() 

    def user_input(self): 
     # Get entry1 value, store it as an attribute and print to console 
     self.raw_input = self.v.get() 
     print(self.raw_input) 


    def initUI(self): 
     self.frame = Frame(self, relief=RAISED, borderwidth=0) 
     self.frame.pack(fill=BOTH, expand=True) 

     self.entry1 = Entry(self.frame, textvariable=self.v) 
     self.entry1.pack(side=TOP, fill=X, expand=False, padx=2, pady=2) 
     self.entry1.focus_set() 


     #self.rename_button = Button(self.frame, text="Dispaly text", 
     #       command = self.user_input()) 
     self.rename_button = Button(self.frame, text="Display text", 
            command = self.user_input) 
     self.rename_button.pack(side=TOP, expand=False, padx=2, pady=2) 


     # You can remove the triple quotes to display these widgets 
     """ 
     self.entry2 = Entry(self.frame) 
     self.entry2.pack(side=TOP, fill=X, expand=False, padx=2, pady=2) 


     self.quit_button = Button(self.frame, text="Quit", command=self.quit) 
     self.quit_button.pack(side=RIGHT, padx=5, pady=5) 

     self.ok_button = Button(self.frame, text="OK") 
     self.ok_button.pack(side=RIGHT, padx=5, pady=5) 

     """ 

     self.pack(fill=BOTH, expand=True) 


def main(): 
    root = Tk() 


    app = AD(root) 
    root.mainloop() 

Ваш GUI: enter image description here

SUGGESTIONS:

  • Помнить поставить себя. перед вашими виджетами.
  • Проверяйте один виджет за раз, чтобы помочь вам отладить ваш код.
+0

Это именно то, что я хотел сделать - большое спасибо. Я не уверен, что понимаю все правильно (this() для имени функции). – Fangir

+1

@Fangir Добро пожаловать. Когда вы вводите имя функции в командной строке IDLE, python создает объект функции. Однако, когда вы вводите имя функции, за которым следует(), без пробелов между именем и(), вы увидите, что python запускает/выполняет вашу функцию (это похоже на то, что объект функции выполняет свою работу). Мой 2 центов стоит ... –