2014-11-30 3 views
0

Я пытаюсь написать небольшое приложение python tkinter, которое отображает выделенный текст (с помощью мыши) другой метки. Но у меня проблемы с несколькими текстовыми виджетами. Как узнать, какой текстовый виджет я использую? Есть 10 текстовых виджета, и когда я выбираю текст из любого виджета, он должен показывать ярлык. Я использую python 3.4.2 для Windows 7. Большое спасибо.Как получить выделенный текст в нескольких текстовых виджетах в python?

#! python3 
# -*- coding: utf8 -*- 

from tkinter import * 

class omniAnaliz(Frame): 
    def __init__(self, master): 
     Frame.__init__(self, master) 
     self.screen() 

    def screen(self): 
     self.t1 = Text(self, height=1, width=50) 
     self.t1.pack(side='top') 
     self.t1.insert(END, '1D D6 F8 F0 C3 08 04 00 62 63 64 65 66 67 68 69') 
     self.t1.configure(state="disabled") 

     self.t2 = Text(self, height=1, width=50) 
     self.t2.pack(side='top') 
     self.t2.insert(END, '30 F0 F8 D6 1D 64 64 01 00 71 1D 9F 00 1D 9F 00') 
     self.t2.configure(state="disabled") 

     # More text widget 

     self.l1 = Label(self) 
     self.l1.pack(side='top') 

     self.t1.bind("<Button-3>", self.hex2dec) 
     self.t2.bind("<Button-3>", self.hex2dec) 

    def hex2dec(self, event): 
     self.l1.config(text=self.t1.get(SEL_FIRST, SEL_LAST)) 

if __name__ == '__main__': 
    root = Tk() 
    omniAnaliz(root).pack() 
    root.mainloop() 
+0

Таким образом, чтобы сделать thinkgs понятным. У вас есть 10 текстовых виджетов, и вы хотите получить метку используемого виджета? – Marcin

+0

@Marcin, Моя основная цель - показать выбранные данные на экране. Независимо от того, какой виджет используется. Есть 10 записей данных, но один вывод данных. Ввод данных - это шестнадцатеричные данные. Когда я выбираю один из шестнадцатеричных данных с помощью мыши, программа преобразует hex в десятичную и отображает результат на экран. Извините мой английский. – metehan

ответ

1

Как правило, вы храните каждый идентификатор Tkinter виджета в списке и передаете ему смещение. Я предпочитаю StringVar для установки() для метки, но это личное предпочтение.

from tkinter import * 
from functools import partial 

class omniAnaliz(Frame): 
    def __init__(self, master): 
     Frame.__init__(self, master) 
     self.text_vars=[] ## text widget id's 
     self.screen() 

    def screen(self): 
     ctr=0 
     for txt in ['1D D6 F8 F0 C3 08 04 00 62 63 64 65 66 67 68 69', 
       '30 F0 F8 D6 1D 64 64 01 00 71 1D 9F 00 1D 9F 00', 
       'a, b, c, 1, 2, 4']: 
      t = Text(self, height=1, width=50) 
      t.pack(side="bottom") 
      t.insert(END, txt) 
      t.configure(state="disabled") 
      t.bind("<Button-3>", partial(self.hex2dec, ctr)) 
      ## first ID is item[0], 2nd text widget is item[1], etc. 
      self.text_vars.append(t) 
      ctr += 1 

     self.label_text=StringVar() 
     self.label_text.set("Nothing yet") 
     self.l1 = Label(self, textvariable=self.label_text) 
     self.l1.pack(side='top') 

    def hex2dec(self, widget_num, event): 
     this_text_widget=self.text_vars[widget_num] 
     self.label_text.set(this_text_widget.get(SEL_FIRST, SEL_LAST)) 

root = Tk() 
omniAnaliz(root).pack() 
root.mainloop() 
+0

Хорошее использование частичного. Просто для полноты, вы также можете привязать к лямбда, например. 'lambda e, ctrr = ctr: self.hex2dec (ctrr, e)' – Marcin

+0

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

+0

@Curly Joe, спасибо за вашу помощь, это сработало. – metehan

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