Форум сайта python.su
Добрый день! Возникла такая проблема :
С использованием Tkinter нужно сделать опросник без использования всплывающих окон для ввода информации
Идея такая - на форме размещаются
1) метка, текст которой меняется в зависимости от вариантов ранее выбранных ответов
2) список, элементы которого также меняются в зависимости от ранее полученных ответов
Хотелось бы получить следующее:
- при нажатии на кнопу запускается функция , в которой пользователю задаются вопросы, а отвечать он должен совершая двойной щелчок по списку.
Но так сделать не получается.
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from tkinter import * class main: def __init__(self,master): self.master = root self.master.fromtask = False # self.master.fromtask принимает значение True во время выполнения функции Do self.quest = Label(self.master) self.butt = Button(self.master,text='Do',command=self.do) self.varList = Listbox(self.master) self.quest.pack() self.varList.pack() self.butt.pack() self.varList.bind('<Double-1>',self.lbmouse) #заполняем список какими-то исходными значениями: for i in range(15): self.varList.insert (END,i) self.master.mainloop() def varListClear(self): # для периодической очистки списка вариантов self.varList.delete(0,END) def lbmouse (self,event): if self.master.fromtask: #Двойной щелчок во время выполнения функции Do print ('Функция Do выполняется') def do (self): self.master.fromtask = True self.quest['text'] = 'Вопрос 1' if self.varList()[0] == 1: self.quest['text'] = 'Тогда Вариант 1' self.varListClear() # заполняем список новыми значениями: for x in range (5): self.varList.insert() if self.varList()[0] == 1: self.quest['text'] = 'Тогда вариант 1.1' else: self.quest['text'] = 'Тогда вариант 1.2' elif self.varList()[0] == 3: self.quest['text'] = 'Тогда Вариант 2' self.master.fromtask = False root=Tk() main(root)
Отредактировано Babay (Фев. 24, 2017 09:26:06)
Офлайн
Babay
self.master.fromtask = False
if self.master.fromtask
def lbmouse (self,event): print self.master.fromtask#?? if self.master.fromtask:
Отредактировано vic57 (Фев. 24, 2017 10:20:31)
Офлайн
vic57Я не очень понимаю как сделать так, чтобы 1) этот обработчик отрабатывал щелчок по списку внутри функции do. По умолчанию он работает внутри основного цикла mainloop() и может вызывать какую-то функцию.
def lbmouse (self,event): print self.master.fromtask#?? if self.master.fromtask:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from tkinter import * import tkinter.simpledialog as simpledialog class main: def __init__(self,master): self.master = root self.master.fromtask = False # self.master.fromtask принимает значение True во время выполнения функции Do self.quest = Label(self.master) self.butt = Button(self.master,text='Do',command=self.do) self.varList = Listbox(self.master) self.quest.pack() self.varList.pack() self.butt.pack() self.varList.bind('<Double-1>',self.lbmouse) #заполняем список какими-то исходными значениями: for i in range(15): self.varList.insert (END,i) self.master.mainloop() def varListClear(self): # для периодической очистки списка вариантов self.varList.delete(0,END) def lbmouse (self,event): if self.master.fromtask: #Двойной щелчок во время выполнения функции Do print ('Функция Do выполняется') def do (self): self.master.fromtask = True self.quest['text'] = 'Вопрос 1' a = simpledialog.askinteger('Вопрос 1','Введите число (1 или 3)') if a == 1: self.quest['text'] = 'Тогда Вариант 1' self.varListClear() # заполняем список новыми значениями: for x in range (5): self.varList.insert(x) a = simpledialog.askinteger('Вопрос 2','Введите число (1 или 2)') if a == 2: self.quest['text'] = 'Тогда вариант 1.1' else: self.quest['text'] = 'Тогда вариант 1.2' elif a == 3: self.quest['text'] = 'Тогда Вариант 2' self.master.fromtask = False root=Tk() main(root)
Отредактировано Babay (Фев. 24, 2017 11:28:57)
Офлайн
не в том дело
на входе в функцию
Babayна выходе
self.master.fromtask = True
Babayна входе в другую ф-цию
self.master.fromtask = False
Babayкак работать будет?
if self.master.fromtask:
Отредактировано vic57 (Фев. 24, 2017 12:20:38)
Офлайн
vic57В последнем примере список не используется, поэтому обработчик не важен.
как работать будет?
Отредактировано Babay (Фев. 24, 2017 12:41:05)
Офлайн
не видишь?
#какое значение здесь у fromtask? def lbmouse (self,event): if self.master.fromtask: #Двойной щелчок во время выполнения функции Do print ('Функция Do выполняется') def do (self): self.master.fromtask = True #...... self.master.fromtask = False
Отредактировано vic57 (Фев. 24, 2017 12:57:12)
Офлайн
Я возвращаю self.master.fromtask = False из функции Do для того, чтобы по окончании ее работы щелчок по списку ничего не делал. Но может так и не нужно делать, я не знаю.
Я наверное непонятно объясняю, чего хочу…
Офлайн
ну тут два варианта:
1. if
2. if not
из них один не работает. какой вывод?
Офлайн
Но тут дело же не в значении fromtask
Двойной щелчок по списку гарантирует, что в нем выбрано какое-то значение. Мне нужно каким-то образом в функции Do приостанавливать ее исполнение до очередного щелчка по списку. Вот в чем вопрос. Но так не получается.
Офлайн
BabayВероятно, вам нужен генератор?
Мне нужно каким-то образом в функции Do приостанавливать ее исполнение до очередного щелчка по списку.
Офлайн