Уведомления

Группа в Telegram: присоединиться

#1 Июль 24, 2018 16:13:10

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Баг в Tkinter?

Код ниже просто выводит 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 (Июль 24, 2018 16:14:56)

Офлайн

#2 Июль 24, 2018 17:03:27

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Баг в Tkinter?

Возможно, это проблема видеодрайверов. Другого ПК с виндой нет. Если запустите код на своей машине и опишите результат - буду благодарен.

Офлайн

#3 Июль 25, 2018 10:59:08

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 859
Репутация: +  155  -
Профиль   Отправить e-mail  

Баг в Tkinter?

vanvanov
Возможно, это проблема видеодрайверов. Другого ПК с виндой нет. Если запустите код на своей машине и опишите результат - буду благодарен.
да, нет таже фигня, при скроле, или два сверху или два снизу, если мышкой поводить по окну, то если мшка наезжает на чекбокс, чекбокс появляется, лейблы остаються невидимыми..

Офлайн

#4 Авг. 8, 2018 03:26:58

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

Баг в Tkinter?

В общем, баг кроется где-то в порте tk.Label для Windows. Придется в похожих случаях использовать tk.Frame вместо tk.Label, тогда все работает. К сожалению, win-порт оставляет желать лучшего - это уже не первый случай, когда кроссплатформенный код работает по-разному. Например, в другой программе в Windows фокус оказывался не на том виджете, как того хотелось и как то работало в Linux. Выяснилось, что до этого выполнялось label.update(), и когда оно было заменено на root.update_idletasks(), то все стало работать.

Офлайн

#5 Авг. 14, 2018 15:39:30

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Баг в Tkinter?

Делай .update() на каждый элемент затрагивающийся, или на элементы с одним мастером



____________________________________________________

 # Life loop
while alive:
    if (fun > boredom) and money:
        pass_day(fun, boredom, money)
        continue
    else: break

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version