EXTREMES Problem HILFE!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
problembär

Erstmal danke für die weiteren Hinweise zur float-Präzision (kannte das sonst vor allem aus perlfaq4, dort auch zu Perl's "round()"; das Problem gibt's ja in allen Sprachen).

Noch zu der vorigen Frage (spätestens jetzt kommt man bei den vielen Fragen in einem Thread durcheinander):
HWK hat geschrieben:Übrigens: Nette Idee mit SendKeys.
Danke! Ist natürlich ganz übles Hacking ...

Aber mit dem "readline"-Modul (bzw. entsprechend "pyreadline" für Windows) hab' ich's nicht hinbekommen. Mit "readline.insert_text()" kann ich zwar Text in den Puffer von "raw_input()" (stdin) bekommen, aber er wird bei mir auch mit "readline.redisplay()" nicht angezeigt. Hatte da vielleicht jemand mehr Glück?

Viele Grüße
problembär

Unter Linux geht bei mir (doch) auch das:

Code: Alles auswählen

import readline
import threading

def send(a):
    readline.insert_text(a)
    readline.redisplay()

wort = "Auto"

for i in range(10):
    t = threading.Timer(0.2, send, (wort, ))
    t.start()
    wort = raw_input("Wort: ")
(Ohne Timer klappt das bei mir nicht.)

Unter Windows geht das so nicht, weil pyreadline keine ".redisplay()"-Methode bietet.

Gruß
Benutzeravatar
LP640
User
Beiträge: 142
Registriert: Dienstag 29. September 2009, 14:40

hi leute hab wieder ne neue frage
und zwar möchte ich, dass in dem xturtle fenster der mauszeiger als eine von mir zuvor erstellte gif datei zu sehen ist
ich kenne bisher nur den folgenden befehl:

Code: Alles auswählen

getcanvas().config(cursor="crosshair")
damit gehen aber nur schon vorhandene mauszeiger
wie geht das mit nem selbst erstellten?

mfg
LP640
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

LP640 hat geschrieben:hi leute hab wieder ne neue frage
Wenns eine neue Frage ist, dann stell sie in einem neuen Thread. Das ist nicht dein privater Support-Thread.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

@problembär: Der Timer ist ein ziemlich schmutziger Trick, "readline.set_pre_input_hook()" ist die richtige Lösung. Sinnvollerweise strickt man daraus dann einen Kontextmanager.

Der Hintergrund ist, dass "readline.redisplay()" wohl nur funktioniert, wenn readline zur Anzeige bereit ist. Das ist irgendwann während des "raw_input()"-Aufrufs der Fall, nachdem der Prompt angezeigt wurde. Mit dem Timer landest Du mit Glück irgendwo in der Nähe dieses Zeitpunkts.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

@lunar: Schöne Lösung. Wenn man redisplay weglässt, funktioniert es damit auch in der Windows-Konsole.

Code: Alles auswählen

import pyreadline as readline

class readline_insert(object):
    def __init__(self, value):
        self.value = value

    def __enter__(self):
        self.old_hook = readline.set_pre_input_hook(self.input_hook)

    def __exit__(self, exc_type, exc_value, traceback):
        readline.set_pre_input_hook(self.old_hook)

    def input_hook(self):
        readline.insert_text(self.value)

with readline_insert('Hallo'):
	print raw_input('Test > ')
Braucht man redisplay denn überhaupt unter Linux?
MfG
HWK
lunar

Hier funktionierts nicht ohne.
problembär

Wirklich schöne Lösung, lunar!

Hatte sonst noch die Quellen von readline runtergeladen und versucht, "readline.redisplay()" in Python zu emulieren. Hatte gedacht, das könnte doch eigentlich nicht so schwer sein. Es waren dort aber schon in der Grundfunktion ca. 600 Zeilen C-Code :shock: ...

Gruß
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn ich mich mal nörgelnderweise an Details aufhalten darf: Ein Name wie `readline_default_value()` wäre IMHO klarer. Bei "insert" könnte man denken, der String würde wie bei Listen *vor* dem eigentlichen Text eingesetzt werden. Mit "default_value" wäre auch die Intention etwas besser beschrieben. Man möchte halt einen Standardwert vorgeben, den der Benutzer ändern kann und eigentlich nicht irgendwas in einen Text - oder besser: in ein "readline" (was auch immer das ist) - einsetzen. Meine Meinung.
lunar

@snafu: Es steht Dir frei, den Namen zu verändern.
Antworten