Форум сайта python.su
Убегаю. Вечером отпишусь.
Офлайн
Хорошо, буду ждать, удачи
Офлайн
В принципе можно и так.
Тогда используем механизм:
if event.widget["text"] in ["*", "/", "-", "+"]: if self.ent.get()[-1] in [str(i) for i in xrange(10)]: ent.set("end", event.widget["text"])
Офлайн
Извиняюсь за молчание только руки дошли, пробовал ваши советы, подумал сам и в итоге нашел простейший выход:
from tkinter import * class Buts: def __init__(self): but_minus = Button(root, text="-") but_plus = Button(root, text="+") num = Button(root, text=1) num2 = Button(root, text=2) num3 = Button(root, text=3) but_minus.bind("<Button-1>", self.click_on) but_plus.bind("<Button-1>", self.click_on) num.bind("<Button-1>", self.click_on) num2.bind("<Button-1>", self.click_on) num3.bind("<Button-1>", self.click_on) but_minus.pack(), but_plus.pack(), num.pack() num2.pack(), num3.pack() self.ent = Entry(root) self.ent.pack() self.this_last = int() # переменная типа int(), она и играет роль def click_on(self,event): if isinstance(event.widget["text"], str): if isinstance(self.this_last, str): self.ent.insert(END, event.widget["text"]) self.this_last = int() # блокируем знаки if isinstance(event.widget["text"], int): self.ent.insert(END, event.widget["text"]) self.this_last = str() # снимаем блокировку root = Tk() obj = Buts() root.mainloop()
Отредактировано MetalHead (Апрель 20, 2014 11:34:34)
Офлайн
Ой-йой-йой…
Смотрите. У Вас набрались ошибки в коде:
1. Если для построения GUI используем ООП, то надо наследовать от рамки, т.е.
class Buts (tkinter.Frame): # def __init__(self, root=None): super().__init__(self, root) self.pack()
from tkinter import *
self.buttons_number = {} name = [("7", "8", "9"), ("4", "5", "6"), ("1", "2", "3")] for _ in name: frm = tkinter.Frame(self) frm.pack() for btext in name: but_vr = tkinter.Button(frm, text=btext) but_vr.bind("<ButtonRelease-1>", call) # функция call описана в проблеме ниже :) but_vr.pack(side="left") self.buttons_numbers[btext] = but_vr
def call(event): if event.widget in self.button_operations.values(): # проверяем, что нажата одна из операций if self.ent.get[-1] in [str(i) for i in range(10)]: # проверяем, что до нажатия операции в ent есть цифры использую индекс [-1] self.ent.insert("end", event.widget["text"]) # добавляем в конец ent надпись на кнопке операций (* или - или + или /) else: # нажата не кнопка операций, а просто кнопка цифр self.ent.insert("end", event.widget["text"]) # вставляем в конец ent надпись на кнопке цифр
def call(event): if event.widget in self.button_operations_numbers.values(): if self.ent.get[-1] in [str(i) for i in range(10)]: self.ent["state"] = "normal" # включаем, чтобы вставить виджет self.ent.insert("end", event.widget["text"]) self.ent["state"] = "disabled" # снова блокируем else: self.ent["state"] = "normal" self.ent.insert("end", event.widget["text"]) self.ent["state"] = "disabled"
Отредактировано 4kpt_II (Апрель 20, 2014 13:15:09)
Офлайн
4kpt_IIЯ так понимаю для каждого виджета нужен будет свой класс?
1. Если для построения GUI используем ООП, то надо наследовать от рамки, т.е.
Офлайн
MetalHead
Я так понимаю для каждого виджета нужен будет свой класс?
table = MyTable(root) # класс с наследуемым Frame table.grid(row=1, column=1) # располагаем все виджеты этого класса в нужном нам месте
Отредактировано 4kpt_II (Апрель 20, 2014 15:40:37)
Офлайн
Ага, все понятно, буду стараться придерживаться этих правил Вопросы исчерпаны.
Офлайн
Как по мне так легче реализовать “если не цифра и дубль - удалить”, чем перебирать все варианты.
Офлайн