Форум сайта python.su
1.
def lbmouse (self,event): if self.master.fromtask: print ('Функция Do выполняется') def do (self): self.master.fromtask = True #...... self.master.fromtask = False
def lbmouse (self,event): if not self.master.fromtask: print ('Функция Do выполняется') def do (self): self.master.fromtask = True #...... self.master.fromtask = False
Отредактировано vic57 (Фев. 24, 2017 13:40:51)
Офлайн
Вот смотрите, я убрал и список и обработчик. Мне нужен функционал, который дает следующий код, но только без использования всплывающих окон, чтобы данные получались не через всплывающее окно, а из какого-то виджета на форме (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)
Отредактировано Babay (Фев. 24, 2017 13:57:05)
Офлайн
Babay
Может спросите еще какой такой гугл?
Офлайн
FishHookГугл слыхал. Я выше код выложил, реализующий функционал с использованием всплывающих окон. В гуглах пишут (ответы разные)) что мне нужно использовать root.after (не помогло) либо создавать новый процесс для функции (в моем случае Do)
BabayМожет спросите еще какой такой гугл?
Отредактировано Babay (Фев. 24, 2017 14:02:51)
Офлайн
Babayмне кажеться вам стоит пересмотреть алгоритм работы вашей программы.. потому как так как вы хотите сделать у вас не получиться. input ждет ввода, а листбокс ничего не ждет.
Мне нужно каким-то образом в функции Do приостанавливать ее исполнение до очередного щелчка по списку
# -*- 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)
[code python][/code]
Отредактировано PEHDOM (Фев. 24, 2017 15:04:20)
Офлайн
PEHDOM, благодарю за совет. Подумаю как изменить алгоритм вопросов.
Офлайн