Форум сайта python.su
Мне нужно сделать виджет, который будет считать и выводить слева от виджета ввода текста номер строки(как в sublime text и ему подобных). Сам мучаюсь уже вторую неделю. Надеюсь на вашу помощь. Надо б встроить код данного виджета в мой(не очень мой).
код на python 3.7
import tkinter from tkinter.filedialog import asksaveasfile, askopenfile from tkinter.messagebox import showerror import easygui FILE_NAME = tkinter.NONE def credit(): easygui.msgbox( " You can save files with buttons Save and Save As \n You can open files with button Open \n You can create new file with button New File") def new_file(): global FILE_NAME FILE_NAME = "Untitled" text.delete('1.0', tkinter.END) def save_file(): data = text.get('1.0', tkinter.END) out = open(FILE_NAME, 'w') out.write(data) out.close() def save_as(): out = asksaveasfile(mode='w', defaultextension='.txt') data = text.get('1.0', tkinter.END) try: out.write(data.rstrip()) except Exception: showerror(title="Oops!", message="Unable to save file....") def open_file(): global FILE_NAME inp = askopenfile(mode="r") if inp is None: return FILE_NAME = inp.name data = inp.read() text.delete('1.0', tkinter.END) text.insert('1.0', data) root = tkinter.Tk() root.title("2Text") root.geometry("600x400") root.minsize(width=600, height=400) menuBar = tkinter.Menu(root) fileMenu = tkinter.Menu(menuBar) menuBar.add_command(label="New", command=new_file) menuBar.add_command(label="Open", command=open_file) menuBar.add_command(label="Save", command=save_file) menuBar.add_command(label="Save As", command=save_as) menuBar.add_command(label="Exit", command=root.quit) menuBar.add_command(label="Credits & Info", command=credit) root.config(menu=menuBar) text = tkinter.Text(root, width=400, height=400) text.pack() root.mainloop()
Отредактировано linkington3 (Май 16, 2019 18:22:02)
Офлайн
Не знаю насколько это велосипед, но можно:
создать label в нужном месте,
сунуть в отдельный поток цикл, который через каждые, например 0.1 с. считывает весь текст с твоего текстового виджета, подсчитывает кол-во \n и с помощью label.config(text = ‘Новый текст’) - изменяет значение label.
Примерный код такого “безобразия”, только закрытие процесса в случае выхода не реализовано:
import tkinter from threading import Thread from time import sleep class MyWindow(tkinter.Tk): def __init__(self): super().__init__() self._create_widgets() Thread(target=self._update).start() def _create_widgets(self): self.entry_text = tkinter.Text() self.entry_text.pack() self.label_pos_cursor = tkinter.Label(text='0') self.label_pos_cursor.pack(side=tkinter.BOTTOM, anchor='w') def _update(self): while True: text = self.entry_text.get('1.0', tkinter.END) allusion = text.count('\n') self.label_pos_cursor.config(text=allusion) sleep(0.1) if __name__ == '__main__': root = MyWindow() root.mainloop()
Офлайн
BOBAHЭто не велосипед, это медведь на велосипеде который крутит педали костылями. Ткинтер событийно ориентированоый модуль, и этим нужно пользоваться.
унуть в отдельный поток цикл, который через каждые, например 0.1 с. считывает весь текст с твоего текстового виджета, подсчитывает кол-во \n и с помощью label.config(text = ‘Новый текст’) - изменяет значение label.
Примерный код такого “безобразия”, только закрытие процесса в случае выхода не реализовано:
[code python][/code]
Отредактировано PEHDOM (Май 17, 2019 22:51:34)
Офлайн
PEHDOMТочно сказано
Это не велосипед, это медведь на велосипеде который крутит педали костылями
Офлайн