Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 24, 2017 09:25:12

Babay
Зарегистрирован: 2015-05-11
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача данных в цикл по щедчку мыши

Добрый день! Возникла такая проблема :
С использованием 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)

Офлайн

#2 Фев. 24, 2017 10:19:02

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Передача данных в цикл по щедчку мыши

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)

Офлайн

#3 Фев. 24, 2017 11:13:09

Babay
Зарегистрирован: 2015-05-11
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача данных в цикл по щедчку мыши

vic57
def lbmouse (self,event): print self.master.fromtask#?? if self.master.fromtask:
Я не очень понимаю как сделать так, чтобы 1) этот обработчик отрабатывал щелчок по списку внутри функции do. По умолчанию он работает внутри основного цикла mainloop() и может вызывать какую-то функцию.
Вот какую функциональность хотелось бы реализовать, но только без всплывающих окон, чтобы ответы на очередной вопрос получались по щелчку на элементе списка

 #!/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)

Офлайн

#4 Фев. 24, 2017 12:19:44

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Передача данных в цикл по щедчку мыши

не в том дело
на входе в функцию

Babay
self.master.fromtask = True
на выходе
Babay
self.master.fromtask = False
на входе в другую ф-цию
Babay
if self.master.fromtask:
как работать будет?

Отредактировано vic57 (Фев. 24, 2017 12:20:38)

Офлайн

#5 Фев. 24, 2017 12:35:17

Babay
Зарегистрирован: 2015-05-11
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача данных в цикл по щедчку мыши

vic57
как работать будет?
В последнем примере список не используется, поэтому обработчик не важен.
А если делать так, как я хочу, то по идее, по щелчку на списке, внутри функции Do значение varList.curselection() должно считываться и как-то обрабатываться. А как работать он должен - вот этого -то и не пойму.

Отредактировано Babay (Фев. 24, 2017 12:41:05)

Офлайн

#6 Фев. 24, 2017 12:55:50

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Передача данных в цикл по щедчку мыши

не видишь?

     #какое значение здесь у 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)

Офлайн

#7 Фев. 24, 2017 13:06:09

Babay
Зарегистрирован: 2015-05-11
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача данных в цикл по щедчку мыши

Я возвращаю self.master.fromtask = False из функции Do для того, чтобы по окончании ее работы щелчок по списку ничего не делал. Но может так и не нужно делать, я не знаю.
Я наверное непонятно объясняю, чего хочу…

Офлайн

#8 Фев. 24, 2017 13:10:21

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Передача данных в цикл по щедчку мыши

ну тут два варианта:
1. if
2. if not
из них один не работает. какой вывод?

Офлайн

#9 Фев. 24, 2017 13:19:14

Babay
Зарегистрирован: 2015-05-11
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача данных в цикл по щедчку мыши

Но тут дело же не в значении fromtask
Двойной щелчок по списку гарантирует, что в нем выбрано какое-то значение. Мне нужно каким-то образом в функции Do приостанавливать ее исполнение до очередного щелчка по списку. Вот в чем вопрос. Но так не получается.

Офлайн

#10 Фев. 24, 2017 13:27:04

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Передача данных в цикл по щедчку мыши

Babay
Мне нужно каким-то образом в функции Do приостанавливать ее исполнение до очередного щелчка по списку.
Вероятно, вам нужен генератор?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version