@Odin: Werd mal diese ganzen führenden doppelten Unterstriche los. Das sollte jeweils nur einer sein, nicht zwei. Wenn überhaupt, man könnte die auch ganz weglassen.
`_thread` wird importiert, aber nicht verwendet. Was gut ist, denn der führende Unterstrich sagt ja, dass das kein Modul ist das man verwenden soll, weil es nicht zur öffentlichen API gehört.
Als nächstes solltest Du ``global`` loswerden. Globale Variablen machen Programme sehr unübersichtlich und Python hat Klassen, so dass man die auch gar nicht braucht.
`__placeholder()` macht keinen Sinn. An den Stellen wo diese Funktion aufgerufen würde, wenn Du sie nicht vorher ersetzt, fällt der Aufruf auf die Nase weil Du Argumente übergibst, die diese Funktion gar nicht erwartet. Da kannst Du auch einfach mit `None` initialisieren, das hat letztlich einen gleichwertigen Effekt. Auch das wird zu einer Ausnahme führen, der Code ist aber simpler.
Wobei die Variablen gar nicht uninitialisiert sein sollten. Das passiert ja auch nur weil es globale Variablen sind, und keine Attribute die in einer `__init__()`-Methode garantiert vor der Benutzung sinnvoll belegt werden.
Für das Importiern aus dem `telegram.ext`-Modul würde ich nur eine ``import``-Anweisung verwenden.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).
`custom_keyboard` ist ein Laufzeitfehler:
Code: Alles auswählen
In [14]: [['Licht']['Options']]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-14-b99d9c166308> in <module>()
----> 1 [['Licht']['Options']]
TypeError: list indices must be integers or slices, not str
Etwas aufgeräumter sähe der Bot dann so aus:
Code: Alles auswählen
#!/usr/bin/env python3
from copy import deepcopy
from telegram import ReplyKeyboardMarkup
from telegram.ext import CommandHandler, Filters, MessageHandler, Updater
class Bot:
TOKEN = 'XXXXXX-I'
def __init__(self, command_callback, contact_callback):
self.command_callback = command_callback
self.contact_callback = contact_callback
self.updater = Updater(self.TOKEN)
dispatcher = self.updater.dispatcher
dispatcher.add_handler(
CommandHandler('lichtschalter', self.show_keyboard)
)
dispatcher.add_handler(
MessageHandler(Filters.text, self.handle_light_trigger)
)
dispatcher.add_handler(
MessageHandler(Filters.contact, self.handle_contact_trigger)
)
def start(self):
self.updater.start_polling()
print('Idle')
def stop(self):
self.updater.stop()
@staticmethod
def show_keyboard(bot, update):
print('new Keyboard')
bot.send_message(
chat_id=update.message.chat_id,
text='',
#
# FIXME Trying to index a list with a string doesn't work.
#
reply_markup=ReplyKeyboardMarkup([['Licht']['Options']]),
)
def handle_light_trigger(self, _bot, update):
print('cmd')
print(self.command_callback)
message = update.message
if message.from_user.id is None:
print('NONE')
print(message.from_user.id)
print(message.from_user.id, '|', type(message.from_user.id))
print(message.text, '|', type(message.text))
self.command_callback(123456789, 'TestText')
print('##################')
def handle_contact_trigger(self, _bot, update):
print('contact')
print(self.contact_callback)
message = update.message
self.contact_callback(
deepcopy(message.from_user.id), deepcopy(message.contact.user_id)
)
print('##################')
Und ich sehe da keinen Grund warum das ausgerechnet an der von Dir im ersten Beitrag angegebenen Stelle aufhören sollte etwas auszugeben.
Bei den Importen fällt übrigens auf, dass das entweder keine absolut angegebenen Importe sind, oder das Du mehrere Module hast die nicht in einem Package stecken. Das sollte so nicht sein. Wenn man ein Programm oder eine Bibliothek hat, die aus mehr als einem Modul besteht, sollte man die Gefahr von Namenskollisionen möglichst klein halten, in dem man sie in einem Package bündelt, so das nur dieser Packagename auf oberster Ebene mit allen anderen Bibliotheken auf dem System konkurriert.
Und es ist in Python nicht üblich eine Klasse pro Modul zu haben. Also ist ein eigenes Modul für die `Bot`-Klasse eventuell keine gute Aufteilung.