Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Erroneous character when reading in a loop #8

Open
drepamig opened this issue Nov 16, 2018 · 11 comments
Open

Erroneous character when reading in a loop #8

drepamig opened this issue Nov 16, 2018 · 11 comments
Labels
bug Something isn't working wontfix This will not be worked on

Comments

@drepamig
Copy link

drepamig commented Nov 16, 2018

I'm testing out running the select menu on an unknown depth configuration dictionary like so:

while hasattr(workingLibrary, "keys"):
    print("Available Configurations")
    choices = list(workingLibrary.keys())
    workingLibrary = workingLibrary[choices[cutie.select(choices)]]

After the first loop, it appears as though there is an erroneous keypress (in my case a letter P) detected and waiting in the buffer. When I use the arrows to make the 2nd selection, two key presses are detected/passed and it breaks out of that selection and continues on to the 3rd. This behaviour repeats until I hit the end of the dict. I added the following code to your init.py from Rosetta Code:

def flush_input():
    try:
        import msvcrt
        while msvcrt.kbhit():
            msvcrt.getch()
    except ImportError:
        import sys, termios    #for linux/unix
        termios.tcflush(sys.stdin, termios.TCIOFLUSH)

And call that function immediately before "keypress = readchar.readkey()" and it solves the issue. I've tried to track down the source of the erroneous keypress, but haven't had any luck.

@provinzkraut
Copy link
Contributor

Could you show us some data so that the issue can be recreated?

I think it is more of an issue with readchar.

Should be fixed though if the suggestions from issue #7 get implemented.

@drepamig
Copy link
Author

drepamig commented Nov 16, 2018

Sure - I was able to duplicate the issue with this code:

import cutie

sampleDict = {
    "a": {"1": {"d": 9, "e": 8}, "2": {"f": 7, "g": 6}, "3": {"h": 5, "i": 4}},
    "b": {"1": {"d": 9, "e": 8}, "2": {"f": 7, "g": 6}, "3": {"h": 5, "i": 4}},
    "c": {"1": {"d": 9, "e": 8}, "2": {"f": 7, "g": 6}, "3": {"h": 5, "i": 4}},
}

workingDict = sampleDict

while hasattr(workingDict, "keys"):
    print("Available Configurations")
    choices = list(workingDict.keys())
    workingDict = workingDict[choices[cutie.select(choices)]]

Run it and make your first selection then try to make a 2nd selection. You'll see it rapidly loop through the dict and crash with an index out of range error.

If I add the flush_input() function referenced in my first post to fire immediately before keypress = readchar.readkey(), the menu behaves as expected.

@provinzkraut
Copy link
Contributor

I can't reproduce the described behaviour..
Are you sure this is exactly what you're doing in your code?

@Kamik423
Copy link
Owner

Kamik423 commented Nov 16, 2018

I also cannot reproduce the issue. What version of python and cutie are you using? You mentioned an init.py. There was an __init__.py that has been removed in version 0.1.0.

@drepamig
Copy link
Author

drepamig commented Nov 16, 2018

Update: I completely removed cutie using PIP, and reinstalled it using pip install git+https://github.com/Kamik423/cutie.git. This corrected the __init__.py to be cutie.py, but the issue remains. I also tried it in a new and barebone Anaconda environment with no improvement.

Thanks for helping me with this! I'm using Anaconda with Python 3.7. I'm using the latest cutie available from PyPI (cutie-0.2.1), which I removed and reinstalled at the start of the recording. I also made sure readchar was the latest available as well (not shown in the recording). I still notice that in my site-packages directory, the cutie folder still contains a __init__.py after reinstallation. Is my whole issue because I'm using an out of date version?

I recorded an example of the behavior and posted it below. I included the onscreen keyboard so you can see my inputs when the issue arises.

2018-11-16_11-59-57

The contents of getkey_error.py are the same as the GIST posted before:

import cutie

sampleDict = {
    "a": {"1": {"d": 9, "e": 8}, "2": {"f": 7, "g": 6}, "3": {"h": 5, "i": 4}},
    "b": {"1": {"d": 9, "e": 8}, "2": {"f": 7, "g": 6}, "3": {"h": 5, "i": 4}},
    "c": {"1": {"d": 9, "e": 8}, "2": {"f": 7, "g": 6}, "3": {"h": 5, "i": 4}},
}

workingDict = sampleDict

while hasattr(workingDict, "keys"):
    print("Available Configurations")
    choices = list(workingDict.keys())
    workingDict = workingDict[choices[cutie.select(choices)]]

@Kamik423 Kamik423 added the bug Something isn't working label Nov 16, 2018
@Kamik423
Copy link
Owner

Kamik423 commented Nov 16, 2018

I still cannot reproduce the issue.

HOWEVER, I think it should be fixed in a new branch. Could you manually download the version from there and try if the issue still occurs?

Depending on your setup you might have to:

# Uninstall cutie
pip3 uninstall cutie
# Link the branch version
# (In the downloaded directory)
pip3 install -e .

And then try to reproduce.

Of course you can afterwards revert back to the release version with

pip3 uninstall cutie
pip3 install cutie

Thank you for your help!

@drepamig
Copy link
Author

Ok, so I have a bit more information. I tried the new branch and it's improved. The extra key in the buffer is still there, but it doesn't immediately cause cutie to continue to the next menu, so that's an improvement. Since you can't reproduce this, I tried rebooting into safe mode and testing (to eliminate any other programs that may be interacting) and still had the same issue. I then installed cutie on another computer with Anaconda3 and tried the test - WORKS FINE! But that just made my issue more confusing. I then installed a completely separate instance of python (WinPython 3.7 zero), ran the test in there and it also WORKS FINE! Now I have no idea what would be causing it in my primary python installation. Whatever the problem in my installation is, flushing the buffer fixes it...

tldr: Something isn't working right in my python installation but your fix improved the experience and makes it usable. Cutie works fine for me in a clean (new) python installation. I have to fix my python.

Sorry for wasting your time and I appreciate the help!

@Kamik423
Copy link
Owner

Thank you for the huge amount of effort you are putting into this!

You are saying, that it "improves" the situation. Is there any way you are still noticing it or is it (for all intents and purposes) fixed? The extra key should just get dropped now.

If there is any chance people could still be experiencing this I'd rather play it save and try to catch the mysterious character.

@drepamig
Copy link
Author

The changes you made have caused the extra key to be ignored, but you still have to "get past" it. It's a little clunky to explain, so here is a recording of it in action - notice how I have to hit the arrow twice on the 2nd and 3rd menu prompt. It doesn't affect the selection like it used to, but it's still there.

2018-11-19_09-16-58

The other thing to note is that enter won't be accepted until that extra character is cleared from the buffer. You can see that demonstrated below

2018-11-19_10-39-18

Please let me know if you need more info!

@Kamik423
Copy link
Owner

Kamik423 commented Nov 19, 2018

Looking through the readchar issues: this might be related to this which references this.

This appears to very much be a readchar issue. Maybe you could post over there and hope they fix it somehow.

I will leave this open for now in case somebody else has this issue (please comment!).

@Kamik423 Kamik423 added the wontfix This will not be worked on label Nov 19, 2018
@Cube707
Copy link

Cube707 commented Aug 12, 2022

should be fixed in more recent readchar versions

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working wontfix This will not be worked on
Projects
None yet
Development

No branches or pull requests

4 participants