Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt4. Передача значения в QLineEdit в метод другого объекта. [RSS Feed]

#1 Июнь 14, 2015 18:18:37

drjackild
Зарегистрирован: 2015-06-14
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4. Передача значения в QLineEdit в метод другого объекта.

Всем привет. Сейчас изучаю Python, прохожу курс на Coursera. Собственно вопрос. В процесе обучения написал очень простую игру. Логика лежит в отдельном классе. В другом файле создан класс, реализующий графический интерфейс. Вот код обеих файлов:

guess_the_number.py

import random
import math
import guess_the_number_GUI
class GuessTheNumber:
    def __init__(self):
        self.guess_range = 100
        self.secret_number = 0
        self.attempts = 0
        self.new_game()
    # helper function to start and restart the game
    def new_game(self):
        # initialize global variables used in your code here
        self.attempts = int(math.ceil(math.log(self.guess_range, 2)))
        self.secret_number = random.randrange(0, self.guess_range)
        print '-----------------'
        print 'New game started!'
        print 'Range is [0, %i)' % self.guess_range
        print 'You have', self.attempts, 'attempts'
        print 'Good luck!'
        print '-----------------'
    # define event handlers for control panel
    def range100(self):
        # button that changes the range to [0,100) and starts a new game
        self.guess_range = 100
        self.new_game()
    def range1000(self):
        # button that changes the range to [0,1000) and starts a new game
        self.guess_range = 1000
        self.new_game()
    def input_guess(self, inp):
        self.inp = int(inp)
        print 'Your guess is', self.inp
        if self.inp < self.secret_number:
            self.attempts -= 1
            if self.attempts > 0:
                print 'Higher!'
            print self.attempts, 'attempts left.'
        elif self.inp == self.secret_number:
            print 'Correct!'
            print ''
            self.new_game()
        elif self.inp > 0:
            self.attempts -= 1
            if self.attempts > 0:
                print 'Lower!'
            print self.attempts, 'attempts left.'
        if not self.attempts:
            print 'Secret numer is', self.secret_number
            print 'You loose! :('
            print ''
            self.new_game()
        print ''
guess_the_number_GUI.start_gui(GuessTheNumber())

guess_the_number_GUI.py

import sys
from PyQt4 import QtGui, QtCore
class GuessTheNumberGui(QtGui.QWidget):
    def __init__(self, game, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.gtn_game = game
        self.setWindowTitle('Guess the number!')
        self.setGeometry(900, 400, 320, 240)
        grid = QtGui.QGridLayout()
        self.range100_button = QtGui.QPushButton('Set range to [0 - 100)')
        self.range1000_button = QtGui.QPushButton('Set range to [0 - 1000)')
        self.guess_input_entry = QtGui.QLineEdit()
        grid.addWidget(self.range100_button, 0, 0)
        grid.addWidget(self.range1000_button, 1, 0)
        grid.addWidget(self.guess_input_entry, 2, 0)
        self.range100_button.clicked.connect(self.gtn_game.range100)
        self.range1000_button.clicked.connect(self.gtn_game.range1000)
        self.guess_input_entry.returnPressed.connect(self.gtn_game.input_guess)
        self.setLayout(grid)
def start_gui(game):
    app = QtGui.QApplication(sys.argv)
    gui = GuessTheNumberGui(game)
    gui.show()
    sys.exit(app.exec_())

Вопрос: как при нажатии Enter передать методу gtn_game.input_guess значение указанное в QLineEdit, в качестве аргумента? С событием разобрался, это returnPressed, но вот как дальше быть, не знаю. Заранее благодарен за помощь.

Офлайн

#2 Июнь 14, 2015 18:56:09

drjackild
Зарегистрирован: 2015-06-14
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4. Передача значения в QLineEdit в метод другого объекта.

Собственно вроде бы нашел решение, оно работает, но не знаю насколько правильно так делать. Добавил метод класса GuessTheNumberGUI, следующего содержания:

def send_line(self):
    self.gtn_game.inputt_guess(self.guess_input_entry.test())

Ну и привязал к input_guess_entry в __init__:
self.guess_input_entry.returnPressed.connect(self.return_line)

Как то не очень эллегантно смотрится, есть еще какие-нибудь варианты? Вроде бы должно быть решение через неименованную функцию, но я не очень понимаю, как :-)

Офлайн

#3 Июнь 14, 2015 19:14:33

drjackild
Зарегистрирован: 2015-06-14
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4. Передача значения в QLineEdit в метод другого объекта.

Вроде бы разобрался

self.guess_input_entry.returnPressed.connect(lambda: self.gtn_game.input_guess(self.guess_input_entry.text()))

И тогда нам не нужен вообще метод-однострочник.

Офлайн

  • Начало
  • » GUI
  • » PyQt4. Передача значения в QLineEdit в метод другого объекта.[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version