2015-08-07 3 views
0

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

Моя программа преобразует ножки до ножек (рамка A) и Линейные ножки до ножек (рамка B).

Я получаю ошибки, такие как: NameError: global name 'b_entry' is not defined. У меня такое чувство, что я могу делать что-то вроде ссылок на фреймы (self, master, a_frame и т. Д.) Неправильно.

Вот простой пример:

import Tkinter as tk 

class App: 
    def __init__(self, master): 
     self.master = master 
     master.grid() 

     b_frame = tk.Frame(master).grid(row=0) 
     b_name = tk.Label(b_frame, text='Blah').grid(row=1, columnspan=4) 
     b_label = tk.Label(b_frame, text='Label').grid(row=2, column=0) 
     b_entry = tk.Entry(b_frame).grid(row=2, column=1) 
     b_output = tk.Label(b_frame, text='Output') 
     b_output.grid(row=3, columnspan=2) 
     b_button = tk.IntVar() 
     tk.Button(b_frame, text='calc', command=self.convert).grid(row=4, columnspan=2) 

    def convert(self): 
     a = int(b_entry.get()) 
     result = int(a * a) 
     b_output.configure(text=result) 

root = tk.Tk() 
App(root) 
root.mainloop() 

ответ

1

Я вижу две проблемы.

  • Вы не должны назначать виджет переменной, а пакет/сетку - в той же строке. Это приводит к тому, что переменная имеет значение None, потому что это то, что pack и grid. Это испортит вашу иерархию виджетов, потому что, когда b_frame - None, tk.Label(b_frame, ... сделает ярлык дочерним по отношению к окну Tk вместо кадра.
  • Если вы хотите, чтобы переменная была видимой во всех методах класса, вы должны назначить ее как атрибут self.

Таким образом, вы должны изменить линии, как

b_entry = tk.Entry(b_frame).grid(row = 2, column = 1) 

Для

self.b_entry = tk.Entry(b_frame) 
self.b_entry.grid(row = 2, column = 1) 

Тогда вы будете иметь возможность правильно ссылаться на запись в convert.

a = int(self.b_entry.get()) 
+0

А, ок. Это интересно. Я разделил код пакета/сетки до дня. Я заметил, что что-то вроде попыток сделать настройку на них заставило его выбросить ошибку. Я нашел ответ на этот вопрос при поиске SO. По общему признанию, я был немного ленив, объединив их, думая, что я бы сохранил некоторую типизацию, но теперь, когда вы упомянули об этом, отладка немного сложнее. Должен ли я помещать '.self 'перед каждой строкой или только строки, которые нужно вызвать? –

+0

Это прославилось! Я очень ценю эту информацию. Я в основном учился, используя SO и Youtube для руководства. Я обнаружил, что он помогает мне перепроектировать исходные примеры и попытаться повторно реализовать их в моем коде. В большинстве случаев это работает, или, по крайней мере, дает мне точку перехода, чтобы попытаться выяснить, что работает, а что нет. Полагаю, иногда вам просто нужен прямой ответ на прямой вопрос. Спасибо за вашу помощь и время. Я очень ценю это. –

+0

«Должен ли я ставить« я »перед каждой строкой или просто с линиями, которые нужно вызвать?» Вам просто _have_ поставить 'self.' перед назначением, что вы хотите быть доступным в других методах или вне класса полностью. Однако некоторые люди ставят их перед любым заданием, возможно, по эстетическим соображениям или потому, что считают, что им могут понадобиться эти ценности позже. Это в основном вопрос личных предпочтений. – Kevin

Смежные вопросы