2015-12-21 4 views
0

Я не могу найти причину, по которой это связывание не работает. Я пробовал настройку фокуса, в частности, перемещая привязку вне класса. Странно, что он работает один раз в начале программы. Это заставляет меня думать, что привязка действительно работает, но не так, как предполагалось.Tkinter bind работает только один раз

import tkinter as tk 
import os 
import Themes 

########################################################################## 
root = tk.Tk() 

topleft = tk.Frame(root, 
       bg = 'red', 
       ) 

topmid = tk.Frame(root, 
       bg = 'white', 
      ) 

topright = tk.Frame(root, 
       bg = 'blue', 
       ) 

bottomleft = tk.Frame(root, 
        bg = 'yellow', 
       ) 

bottommid = tk.Frame(root, 
        bg = 'green', 
       ) 

bottomright = tk.Frame(root, 
        bg = 'black', 
        ) 

tk.Grid.rowconfigure(root, 0, weight = 20) 
tk.Grid.columnconfigure(root, 0, weight = 30) 
topleft.grid(row = 0, column = 0, 
     sticky = tk.N+tk.E+tk.S+tk.W, 
     rowspan = 2, columnspan = 1) 

tk.Grid.columnconfigure(root, 1, weight = 20) 
topmid.grid(row = 0, column = 1, 
     sticky = tk.N+tk.E+tk.S+tk.W, 
     rowspan = 1, columnspan = 2) 

tk.Grid.columnconfigure(root, 3, weight = 85) 
topright.grid(row = 0, column = 3, 
      sticky = tk.N+tk.E+tk.S+tk.W, 
      rowspan = 3, columnspan = 1) 

tk.Grid.rowconfigure(root, 2, weight = 40) 
bottomleft.grid_propagate(False) 
bottomleft.grid(row = 2, column = 0, 
      sticky = tk.N+tk.E+tk.S+tk.W, 
      rowspan = 1, columnspan = 3) 

tk.Grid.rowconfigure(root, 1, weight = 10) 
tk.Grid.columnconfigure(root, 1, weight = 10) 
bottommid.grid(row = 1, column = 1, 
      sticky = tk.N+tk.E+tk.S+tk.W, 
      rowspan = 1, columnspan = 1) 

tk.Grid.rowconfigure(root, 1, weight = 10) 
tk.Grid.columnconfigure(root, 2, weight = 10) 
bottomright.grid(row = 1, column = 2, 
      sticky = tk.N+tk.E+tk.S+tk.W, 
      rowspan = 1, columnspan = 1) 
########################################################################## 

class File_selector: 
    def __init__(self): 
    self.scrollbar = tk.Scrollbar(bottomleft, 
            orient = 'vertical' 
           ) 
    self.listbox = tk.Listbox(bottomleft, 
           yscrollcommand = self.scrollbar.set 
          ) 
    self.check = print(self.listbox.curselection()) 

    self.scrollbar['command'] = self.listbox.yview 

    for file in os.listdir(os.curdir): 
     if file.endswith(".py"): 
      self.listbox.insert(tk.END, file) 

    self.listbox.bind('<<ListboxSelect>>', lambda e: self.check) 

    self.grid() 
    def grid(self):  
    self.scrollbar.grid(row = 0, column = 1, sticky = tk.N+tk.S) 

    tk.Grid.rowconfigure(bottomleft, 0, weight = 1) 
    tk.Grid.columnconfigure(bottomleft, 0, weight = 1) 
    self.listbox.grid(row = 0, column = 0, 
         sticky = tk.N+tk.E+tk.S+tk.W) 

File_selector() 
root.mainloop() 
+0

, который вызывает один раз на любой выбор ... Вы тогда должны получить выбранный элемент ... –

+0

Не 'self.check' сделать это? На данный момент я просто пытаюсь заставить программу признать меня нажатием на список. @Joran –

+0

Отступ на вашем примере испорчен. –

ответ

1

Линия

self.check = print(self.listbox.curselection()) 

неверен.

Он работает print() и печатает текст на экране (когда создается File_selector объект), а затем присваивает None к self.check (потому что print() возвращается None)

Вам нужно

def check(self, event): 
    print(self.listbox.curselection()) 

или lambda функция нормальной функции

self.check = lambda event:print(self.listbox.curselection()) 

Факс: d, то вы можете связать

self.listbox.bind('<<ListboxSelect>>', self.check) 
+0

Это прекрасно работает. Большое спасибо! В будущем мне все равно нужно проверить, не возвращается ли что-нибудь «Нет»? –

+0

Функции Python возвращают None по умолчанию. Прочтите документ или docstring или используйте 'help (func)', чтобы узнать о возвратах, отличных от значений по умолчанию. –

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