Найти - Пользователи
Полная версия: Баг в Tkinter?
Начало » GUI » Баг в Tkinter?
1
vanvanov
Код ниже просто выводит 100 строк на tk.Canvas (он выбран потому, что в дальнейшем нужны tk.Scrollbar). Он нормально отрабатывает в Linux, но в Windows (удаленка, виртуалка, wine), если я использую yview_scroll на tk.Canvas (см. Bug.bindings), то видимыми остаются только либо 2 строчки сверху, либо снизу, см:

В чем проблема?
 #!/usr/bin/python3
import tkinter as tk
class Bug:
    
    def __init__(self,parent):
        self.parent = parent
        self.gui()
        
    def move_up(self,event=None,value=-1):
        self.cvs.yview_scroll(value,'units')
        
    def move_down(self,event=None,value=1):
        self.cvs.yview_scroll(value,'units')
    
    def bindings(self):
        self.parent.bind('<Down>',self.move_down)
        self.parent.bind('<Up>',self.move_up)
    
    def gui(self):
        self.frames()
        self.widgets()
        self.bindings()
        
    def frames(self):
        self.frm1 = tk.Frame(self.parent)
        self.frm1.pack(expand=1)
    
    def widgets(self):
        self.cvs = tk.Canvas(self.frm1)
        self.cvs.pack()
        self.lbl = tk.Label(self.frm1)
        self.lbl.pack(expand=1)
        self.cvs.create_window(0,0,window=self.lbl)
        
    def add_row(self,text):
        frm = tk.Frame(self.lbl)
        frm.pack()
        cbox = tk.Checkbutton(frm)
        cbox.pack(side='left')
        lbl = tk.Label(frm)
        lbl.config(text=text)
        lbl.pack(side='left')
    
    def fill(self):
        for i in range(100):
            self.add_row('Row %d' % i)
            
    def region (self,x=0,y=0
               ,x_border=0,y_border=0
               ):
        # Both integer and float values are allowed at input
        if x and y:
            self.cvs.configure (scrollregion = (-x/2 - x_border
                                               ,-y/2 - y_border
                                               , x/2 + x_border
                                               , y/2 + y_border
                                               )
                               )
        else:
            print('Empty input is not allowed!')
    
    def scroll(self,event=None,x=0,y=0):
        self.cvs.xview_moveto(x)
        self.cvs.yview_moveto(y)
if __name__ == '__main__':
    root = tk.Tk()
    root.geometry('400x300')
    bug = Bug(root)
    bug.fill()
    bug.region (x        = 400
               ,y        = 2050
               ,x_border = 5
               ,y_border = 20
               )
    bug.scroll()
    root.wait_window()
    root.mainloop()
vanvanov
Возможно, это проблема видеодрайверов. Другого ПК с виндой нет. Если запустите код на своей машине и опишите результат - буду благодарен.
PEHDOM
vanvanov
Возможно, это проблема видеодрайверов. Другого ПК с виндой нет. Если запустите код на своей машине и опишите результат - буду благодарен.
да, нет таже фигня, при скроле, или два сверху или два снизу, если мышкой поводить по окну, то если мшка наезжает на чекбокс, чекбокс появляется, лейблы остаються невидимыми..
vanvanov
В общем, баг кроется где-то в порте tk.Label для Windows. Придется в похожих случаях использовать tk.Frame вместо tk.Label, тогда все работает. К сожалению, win-порт оставляет желать лучшего - это уже не первый случай, когда кроссплатформенный код работает по-разному. Например, в другой программе в Windows фокус оказывался не на том виджете, как того хотелось и как то работало в Linux. Выяснилось, что до этого выполнялось label.update(), и когда оно было заменено на root.update_idletasks(), то все стало работать.
DamMercul
Делай .update() на каждый элемент затрагивающийся, или на элементы с одним мастером
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