Найти - Пользователи
Полная версия: Передача данных в цикл по щедчку мыши
Начало » Python для новичков » Передача данных в цикл по щедчку мыши
1 2
Babay
Добрый день! Возникла такая проблема :
С использованием 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)
        
vic57
Babay
self.master.fromtask = False
if self.master.fromtask
  def lbmouse (self,event):
        print self.master.fromtask#??
        if self.master.fromtask:
 
Babay
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)
        
vic57
не в том дело
на входе в функцию
Babay
self.master.fromtask = True
на выходе
Babay
self.master.fromtask = False
на входе в другую ф-цию
Babay
if self.master.fromtask:
как работать будет?

Babay
vic57
как работать будет?
В последнем примере список не используется, поэтому обработчик не важен.
А если делать так, как я хочу, то по идее, по щелчку на списке, внутри функции Do значение varList.curselection() должно считываться и как-то обрабатываться. А как работать он должен - вот этого -то и не пойму.
vic57
не видишь?
     #какое значение здесь у fromtask?
    def lbmouse (self,event):
        if self.master.fromtask:
            #Двойной щелчок во время выполнения функции Do
            print ('Функция Do выполняется')
    def do (self):
        self.master.fromtask = True
#......
        self.master.fromtask = False
Babay
Я возвращаю self.master.fromtask = False из функции Do для того, чтобы по окончании ее работы щелчок по списку ничего не делал. Но может так и не нужно делать, я не знаю.
Я наверное непонятно объясняю, чего хочу…
vic57
ну тут два варианта:
1. if
2. if not
из них один не работает. какой вывод?
Babay
Но тут дело же не в значении fromtask
Двойной щелчок по списку гарантирует, что в нем выбрано какое-то значение. Мне нужно каким-то образом в функции Do приостанавливать ее исполнение до очередного щелчка по списку. Вот в чем вопрос. Но так не получается.
FishHook
Babay
Мне нужно каким-то образом в функции Do приостанавливать ее исполнение до очередного щелчка по списку.
Вероятно, вам нужен генератор?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB