Найти - Пользователи
Полная версия: Передача данных в цикл по щедчку мыши
Начало » Python для новичков » Передача данных в цикл по щедчку мыши
1 2
vic57
1.
     def lbmouse (self,event):
        if self.master.fromtask:
            print ('Функция Do выполняется')
    def do (self):
        self.master.fromtask = True
#......
        self.master.fromtask = False
2.
     def lbmouse (self,event):
        if not self.master.fromtask:
            print ('Функция Do выполняется')
    def do (self):
        self.master.fromtask = True
#......
        self.master.fromtask = False
babay - вы меня удивляете
Babay
Вот смотрите, я убрал и список и обработчик. Мне нужен функционал, который дает следующий код, но только без использования всплывающих окон, чтобы данные получались не через всплывающее окно, а из какого-то виджета на форме (entry, listbox, неважно)
[code python][/code]#!/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.quest = Label(self.master)
self.butt = Button(self.master,text='Do',command=self.do)
self.quest.pack()
self.butt.pack()
self.master.mainloop()


def do (self):
self.quest['text'] = 'Вопрос 1'
a = simpledialog.askinteger('Вопрос 1','Введите число (1 или 3)')
if a == 1:
self.quest['text'] = 'Тогда Вариант 1'
# заполняем список новыми значениями:
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'

root=Tk()
main(root)
FishHook
Babay
Может спросите еще какой такой гугл?
Babay
FishHook
BabayМожет спросите еще какой такой гугл?
Гугл слыхал. Я выше код выложил, реализующий функционал с использованием всплывающих окон. В гуглах пишут (ответы разные)) что мне нужно использовать root.after (не помогло) либо создавать новый процесс для функции (в моем случае Do)
Попытаюсь по-другому сформулировать вопрос. Если я делаю текстовую версию программы, то данные получаю через input() - функция реализуется очень просто.
Аналог input () в Tkinter - всплывающие окна - они приостанавливают выполняемую функцию до получения ответа.
Затык возникает, когда подобную функциональность я пытаюсь реализовать в одном окне.
PEHDOM
Babay
Мне нужно каким-то образом в функции Do приостанавливать ее исполнение до очередного щелчка по списку
мне кажеться вам стоит пересмотреть алгоритм работы вашей программы.. потому как так как вы хотите сделать у вас не получиться. input ждет ввода, а листбокс ничего не ждет.
Я бы например создал цепочки вопросов ответов и уже из них вычитывал.

 # -*- 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)
        # словарь с цепочкой вопросов-ответов
        self.questions = {'Вопрос №1': ['Ответ 1-1', 'Ответ 1-2'],
                          'Ответ 1-1': ['Ответ 1-1-1', 'Ответ 1-1-2'],
                          'Ответ 1-2': ['Ответ 1-2-1', 'Ответ 1-2-2'],
                             }
        # расшифровка вопросов
        self.questionsList = {'Вопрос №1': 'Вопрос №1',
                              'Ответ 1-1': 'тогда Вопрос№ 1-1',
                              'Ответ 1-2': 'тогда Вопрос№ 1-2',
                                 }
        self.master.mainloop()
    def varListClear(self):
        # для периодической очистки списка вариантов
        self.varList.delete(0,END)
    def lbmouse (self,event):
        if self.master.fromtask:
            #Двойной щелчок если ф-ция запущена, иначе фигвам
            print ('Функция Do выполняется')
            nextQuestion = self.getAnswer()
            self.setQuestion(nextQuestion)
    def setQuestion(self, question):  # Вывести текущий вопрос, и варианты ответа
        if question  in self.questions.keys(): # проверяем есть ли вопрос в списке вопросов, если нет тетс окончен
            self.quest['text'] = self.questionsList[question]
            self.varListClear()
            answers = self.questions[question]
            for a in answers:
                self.varList.insert (END,a)
        else:
            self.quest['text'] = question
            self.master.fromtask = False
    def getAnswer(self): #получить ответ,
        sel = self.varList.curselection()
        answer = self.varList.get(sel[0])
        return(answer)
    def do (self):
        self.master.fromtask = True
        self.setQuestion('Вопрос №1')
root=Tk()
main(root)

это очень приминивный пример , показывающий алгоритм, возможно вам стоит использовать таблицы или СУБД для хранения данных вместо словарей.
Babay
PEHDOM, благодарю за совет. Подумаю как изменить алгоритм вопросов.
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