Найти - Пользователи
Полная версия: PyQt4. Передача значения в QLineEdit в метод другого объекта.
Начало » GUI » PyQt4. Передача значения в QLineEdit в метод другого объекта.
1
drjackild
Всем привет. Сейчас изучаю 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, но вот как дальше быть, не знаю. Заранее благодарен за помощь.
drjackild
Собственно вроде бы нашел решение, оно работает, но не знаю насколько правильно так делать. Добавил метод класса 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)

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

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

И тогда нам не нужен вообще метод-однострочник.
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